5

私は正規表現を使用してJavaでプログラムを書いていますが、文Given string;には多くの構造があります。「ドクター・アーメド・モハメドのための本「学習Java」」。または「最高のタイトル: ahmed mohamed の Java の学習」など...,

つまり:

(本) は [本またはテキスト: または (テキスト)] の場合があります。

(for doctor ) は [ for author または for or for for doctor ] の場合があります。

出力:

(book) の前後と (doctor の場合) の前にある単語を抽出して、タイトルと名付けたいと思います。(doctor の場合) の後に任意の単語を抽出し、Author という名前を付けます。

String inputtext =  "book 'learning java' for doctor  ahmed mohamed";

    Pattern p = Pattern.compile("(?<=(book| the book| \\( . \\)|\\:)) .*? (?=(for doctor| for| for author))");

    Matcher m = p.matcher(inputtext);


        if (m.matches()) {
        String author = m.group(1).trim();
        String bookTitle = m.group(2).trim();

        System.out.println("Title is : " + author);
        System.out.println("Author is : " + bookTitle);
4

1 に答える 1

0

ヒントを出そうとしますが、表情が読めないので推測で。

したがって、あなたの表現は次のとおりです。

(?<=(للدكتورة|للعلامه|للشيخ|للكاتب |للكاتبه|للامام|للاستاذ|للقاضى|للدكتور|ل ))\s[^\s]+\s[^\s]+

分解すると、次のようになります。

  • 肯定的な後ろ姿(?<=(للدكتورة|للعلامه|للشيخ|للكاتب |للكاتبه|للامام|للاستاذ|للقاضى|للدكتور|ل ))
  • 空白文字の後に何らかの単語が続く
  • 空白文字の後に何らかの単語が続く

基本的に、一致は、2 つの空白文字 (単語の組み合わせ) を含み、一致する単語のいずれかが前にある任意のシーケンスになります。

あなたが述べたように、これはあなたの実際の問題のようです:

この表現は私に2つの単語しか与えません

考えられる解決策は、2 つ以上の単語、場合によっては 1 つ以上の空白に一致することです。後ろを振り返った後、これを試してみてください:(?>\s+[^\s]+)+の代わりに\s[^\s]+\s[^\s]+. この部分は、空白の後に非空白が続く任意のシーケンスに一致する必要があります。たとえば、(英語の文字で) 一致aaa bbbするだけでなく、aaa bbb ccc ddd(HTML はここに複数の空白を表示しませんが、1 つのスペースよりも大きいギャップを想像してください)。

于 2013-03-11T17:41:51.617 に答える