0

以下で説明する正規表現と一致する 3 つの異なるシナリオが考えられます。

まず、一致させる必要があるファイル入力:

-- 1 --- (On から :

 On whatever:

-- 2 -- (:) に隣接して

 On:

-- 3 -- (On と : の間の任意の文字)

 On=:

-- 4 -- (O と : の間の = と /n)

 On=
 :

これは私が一致させようとしている正規表現ですが、うまくいきません

// String text = <file contents from above>
Pattern PATTERN = Pattern.compile("^(On\\s(.+):)$", Pattern.MULTILINE | Pattern.DOITALL);
Matcher m = PATTERN.matcher(text);
if (m.find()) {
   System.out.println("Not sure if this is correct to get all 4cases to step in here???");
}

どうも!

4

4 に答える 4

1

このようなものを探していると思います。

Pattern PATTERN = Pattern.compile("^(?:On:|On\s?([^:]*):)$", Pattern.MULTILINE);

または多分

Pattern PATTERN = Pattern.compile("^(?:On:|On\s?([\S\s]*?):)$", Pattern.MULTILINE);
于 2013-10-09T03:00:24.073 に答える
1

^(On\\s(.+):)$あなたが言っているのは、「行の先頭から、「On」の後に正確に1つのスペースが続き、その後に任意の種類の文字が少なくとも1つ続き、その後にコロンが続き、次に行の終わりに一致させたい」.

この正規表現では、最初のケースに一致し"(.+)" ==> 'whatever'ます。ただし、2 番目のケースは一致しません(「On」の後に 1 つのスペースがあり、コロンの前に少なくとも別の文字が必要なため、式は失敗します。3 番目のケースは、スペースがないため一致しません。最後に、 4 番目のケースは問題なく一致します。

だから、トニが答えたように、^On.*:$うまくいくだろう. ただし、「On」部分の後に来るものは何でもグループ化しようとしていると思うので^(On\\s*(\\S*)\\s*:)$、を使用できると思います。これは、「「On」に続いて任意の一連の空白が続き、その後に任意の一連の非空白文字、その後に別の一連の空白、その後にコロン. これにより、2 つのグループが得られます: 最初のグループには "On anything :" が含まれ、2 番目のグループにはその部分のみが含まれます。

于 2013-10-09T03:02:42.917 に答える
1

私は誤解しているかもしれませんが、あなたはこれを考えすぎていると確信しています。これらのシナリオはすべて、基本的に次のように単純化できます。改行または空の文字列を含む、On と : の間のすべて。だから私が言えることからOn.*:、トリックを行う必要があります。

于 2013-10-09T02:34:31.040 に答える
1

次は?もっと簡単です。

On([^:]*):

例えば;

private static final Pattern REGEX_PATTERN = 
        Pattern.compile("On([^:]*):");

public static void main(String[] args) {
    String input = "On=\n:";

    System.out.println(
        REGEX_PATTERN.matcher(input).matches()
    );  // prints "true"

    Matcher matcher = REGEX_PATTERN.matcher(input);
    while (matcher.find()) {
        System.out.println(matcher.group(1));
    }

}

出力:

"=\n"
于 2013-10-09T03:12:03.247 に答える