0

エラーを検索するには、プログラムの出力を解析する必要があります。エラーは次のように示されます。

[(FieldName / Value)=(phrase / What is Up John Carl?)failed rule alphanumeric ] [(FieldName / Value)=(newLabel / Óscar'sIPad)failed ruleillegalchars ]

1行に複数のエラーが発生する可能性があり、エラーごとに太字の単語/文を取得したいと思います。そのために、次のように正規表現を作成しています。

static String s1 = Pattern.quote("[(FieldName/Value) = (");
static String s2 = Pattern.quote(") failed rule");
static String s3 = Pattern.quote("]");
static Pattern p = Pattern.compile(s1 + "(\\w+)/(.+)" + s2 + "(.+)" + s3);
while (matcher.find()) {
    String token = matcher.group(1);
    sb.append("#");
    sb.append(token);
    token = matcher.group(2);
    sb.append("#");
    sb.append(token);
    token = matcher.group(3).trim();
    sb.append("#");
    sb.append(token);
}

しかし、出力は次のとおりです。

#phrase#What is Up John Carl?) failed rule alphanumeric] [(FieldName/Value) = (newLabel/Óscar's IPad#illegalchars

したがって、2つの一致を返すのではなく、1つだけを返します。最初のグループで停止するのではなく、2番目のグループを文字列の残りの部分と照合し"failed rule"ます。パターンの最初のせいだと思いますが(.+)、そこには何でも入ることができるので、が必要(.+)です。それを行う方法はありますか?

4

3 に答える 3

1

このチュートリアル の最後で読むことができるように、 Greedy(.+)であるため、正規表現に適合する最大部分文字列を検索します。たとえば、正規表現では。が返されます。"(ab)(cd)"(.+)ab)(cd

必要なのは、気が進まない数量詞 (.+?)です(?後にマークがあり+ます)。そのおかげで、正規表現はあなたの正規表現に一致する最小限の部分文字列を見つけようとします

"(ab)(cd)"とが(.+?)見つかります。abcd

于 2012-10-12T03:35:43.853 に答える
0
Pattern p = Pattern.compile(s1+"(\\w+)/(.*?)" + s2 + "(.*?)" + s3);
于 2012-10-12T03:21:01.203 に答える
0

数量詞を欲張りでないものにすることができるはずです。これは「?」で行います シンボル。

static Pattern p = Pattern.compile(s1 + "(\\w+)/(.*?)" + s2 + "(.*?)" + s3);

SOでこの他の例を見てください:

Javaでの貪欲でない正規表現

于 2012-10-12T03:23:04.433 に答える