0

2 つのキャプチャ グループ間でトークンをキャプチャする正規表現を作成しようとしています。

入力例

Added experiencevalidator [Java] [Spring]
1.  Added validators [Java] [Spring]
2.  Fixed issues with deletes [JPA] [Java]

基本的にはナンバリング(1.,2.)とタグ([Java][Spring])の間のトークンをキャプチャしたい。

期待されるキャプチャ

マッチャーは、それぞれの行ごとに次を返す必要があります。

Added experiencevalidator
Added validators
Fixed issues with deletes

私は現在、正の先読みと後読みを利用するこのコードを使用しています。

private Pattern TITLE_REGEX = Pattern.compile("(?<=\\d\\.\\s)(.*?)(?=\\[.*)");

private String cleanseTitle(String title){
    Matcher m = TITLE_REGEX.matcher(title);
    if(m.find()){
        System.out.println("Match found");
        System.out.println(m.group(1));;
    }else{
        System.out.println("No Match");
    }
    return title;
}

各行はcleanseTitle、title パラメータを介してメソッドに渡されます。私の問題は、番号が前に付いていない行を処理する方法がわからないことです。コードは現在、番号付けが前にある行を適切に処理しますが、番号付けが前にない行は一致しません。

番号が前にある行または番号が前にない行を処理する正規表現を誰かに提供できますか? 私は任意の正規表現ソリューションを受け入れており、現在の正規表現に恋をしていないので、自由に変更してください。正規表現についてさらに学ぶのに役立つ付随する説明も大歓迎です。

4

3 に答える 3

1

キャプチャグループを使用するため、見回す必要はありません。番号付けまたは先頭のオプションの空白のいずれかに一致するように、後読みを交互に変更します。

^(?:\d+\.\s|\s*)(.*?)(?=\[.*)

ここRegexrでそれを参照してください

ここでは、交互の順序が重要です。2番目の選択肢は常に一致するため、最初の選択肢として番号を付ける必要があります。

これで先読みと怠惰な数量詞もスキップできます

^(?:\d+\.\s|\s*)([^\[]+)

ここRegexrでそれを参照してください

于 2012-12-29T22:31:39.080 に答える
1

次の 2 つの正規表現を使用できます。

  1. 何も置き換え^\d+\.\s+ず、
  2. 何も置き換え(\s+\[[^]]+\])*\s*$ません。

もちろん、Java 文字列のすべてのバックスラッシュを 2 つにすることを忘れないでください。

一致をテストする必要がないことに注意してください。正規表現が一致しない場合、置換は行われません。

サンプルコード:

private static final String
    BEGINNING_NUMBERS = "^\\d+\\.\\s+",
    ENDING_TOKENS = "(\\s+\\[[^]]+\\])*\\s*$";

private String cleanseTitle(String title)
{
    return title.replaceFirst(BEGINNING_NUMBERS, "")
        .replaceFirst(ENDING_TOKENS, "");
}
于 2012-12-29T22:20:50.797 に答える
1

正規表現を修正するだけで、新しい正規表現を作成しないと、最初から数値が一致します。オプションにしないのはなぜですか。

(?<=\\d\\.\\s)?(.*?)(?=\\[.*)
于 2012-12-29T22:21:02.063 に答える