1

この正規表現に関するヘルプを探しています。さまざまな長さの文字列があり、先頭のみを一致させたい。文字列には改行が含まれているため、\A が適しているようです。

次のすべてのケースに一致する正規表現が必要です。

OPTIONAL: [any whitespace/newlines/etc] 
OPTIONAL: <?.*?>
OPTIONAL: [any whitespace/newlines/etc]
MANDAORY: <lemon>
OPTIONAL: anything afterwards.

文字列が巨大になる可能性があるため、最終的な Optional マッチングにより、これが非常に遅くなります。

私の最初の解決策は次のとおりです。

"(^\\s*<?.*?>\\s*<lemon>)[\\s\\S]*|(^\\s*<lemon>.*)[\\s\\S]*"

これは非常に複雑で、先頭だけでなく文字列全体に一致します。

私の現在の最善の試みは次のとおりです。

"\\A(?:\\s*<?.*?>)?\\s*<lemon>"

ただし、 の後に何かがある場合、これは機能せずmon>、一致は失敗します。

誰かが理由について何か考えを持っていますか? の例\Aはまばらで、動作させることができません。

4

1 に答える 1

0

あなたが見逃しているのは、グループ化の概念です。(私はあなたの正規表現を取り、括弧に入れました

 Pattern p = Pattern.compile("(\\A(?:\\s*<?.*?>)?\\s*<lemon>).*");
 Matcher m = p.matcher("   <?.*?>    <lemon> hi   ");
 if (m.find()) {
    System.out.println(m.group(1)); 
 }

グループ 0 は式全体になります

グループ1はあなたが必要とするものです。

このチュートリアルでは、グループの仕組みについて説明します

String.matches() に似たバイナリ回答を取得する方法を探しているだけです。一致が見つかると、文字列の通過が停止します

これを見てください:\\A(?:\\s*<?.*?>)?\\s*<lemon>(.*?)グループ化なし

于 2013-08-09T14:25:38.243 に答える