1

私を助けてください!正規表現を使用して Java でプログラムを作成しています。文には多くの構造があります。

与えられた文 - 「ドクター・アーメド・モハメドのための『学習 Java』」または「最高のタイトル: アーメド・モハメドのための Java の学習」など。

つまり:

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

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

正規表現は次のとおりです。

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

出力:

(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);
        

このプログラムを実行するとエラーが発生し、Regex から離れてしまいます。

4

1 に答える 1

1
  1. がありません)\\)はエスケープされた)であるため(\\)|\\:)、括弧で囲まれています(book| the book| \\ (\\)|\\:))(?<=、閉じ括弧はありません。

  2. 文字列全体を照合しようとするため、ルックアラウンドを使用できないと確信していますMatcher::matches()。したがって、ルックアラウンドは文字列の開始前と文字列の終了後に検索します。を使用Matcher::find()すると、より効果的です。

  3. 括弧内はすべてグループです (ルックアラウンドおよび非キャプチャ グループを除く)。したがって、グループ 1 は(book| the book| \\ (\\)|\\:))グループ 2 です。(\\)|\\:)

  4. (book| the book| \\ (\\)|\\:))(およびfor doctor|...) は、ルックアラウンド ブラケットで十分なので、実際にはブラケットで囲む必要はありません。

  5. 正規表現にスペースが多すぎるようです (スペースは正規表現の一部であるため、一致させる必要があります)。

  6. その部分で先読みを使用するfor doctor|for|for authorと、作成者をキャプチャできなくなります。

  7. 周りを見渡す必要はまったくありません。

これにより、次のことがわかります。

String inputtext =  "book 'learning java' for doctor  ahmed mohamed";
Pattern p = Pattern.compile("(book|\\)|\\:) (.*) for( doctor| author|) (.*)");
Matcher m = p.matcher(inputtext);
if (m.find()) {
    String title = m.group(2).trim();
    String author = m.group(4).trim();
    System.out.println("Title is : " + title);
    System.out.println("Author is : " + author);
}

マッチを使用したい場合:

String inputtext =  "book 'learning java' for doctor  ahmed mohamed";
Pattern p = Pattern.compile("(?:book|the book|(?:\\(.*?\\))|.*?\\:) (.*) for(?: doctor| author|) (.*)");
Matcher m = p.matcher(inputtext);
if (m.matches()) {
    String title = m.group(1).trim();
    String author = m.group(2).trim();

    System.out.println("Title is : " + title);
    System.out.println("Author is : " + author);
}

?:単に非キャプチャ グループであり、それらがなくても一致は同じになりますが、 and の代わりに and を使用する必要group(3)group(5)ありgroup(1)ますgroup(2)

参照

于 2013-03-17T11:42:56.837 に答える