2

次のような文字列が与えられた場合

Prefix without commas, remainder with optional suffix (optional suffix)

1 回のパスで文字列の 3 つの部分を照合して抽出するのに最適な Java 正規表現は何でしょうか?

  1. 最初のコンマまでのプレフィックス
  2. 左括弧までの余り
  3. 括弧内のサフィックス

上記の例では、3 つのグループ (引用符内) は次のようになります。

  1. 「コンマなしのプレフィックス」
  2. 「オプションの接尾辞付きの剰余」
  3. " (オプションのサフィックス)"

文字列の 3 つの部分はすべて可変長です。「残り」部分にはコンマと括弧自体を含めることができ、オプションの接尾辞はスペースで始まる場合とそうでない場合があり、その後に左括弧が続き、0 個以上の文字が続き、その後に右括弧が続き、オプションのスペースが続きます。行末。

のようなものを試す

([^,]*),(.*)(\s*\(.*\))?

グループ 1 と 2 のみを生成し、グループ 3 をグループ 2 の最後に置きます。

4

3 に答える 3

1

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

"^([^,]*),([^()]*)(\\s*\\(.*\\))?$"

正規表現は次のように一致します。

  • ^- 文字列の先頭
  • ([^,]*)- (グループ 1) 以外の 0 文字以上,
  • ,- リテラル,
  • ([^()]*)(- (グループ 2)および以外の 0 文字以上)
  • (\\s*\\(.*\\))?- (グループ 3) オプションのグループ (?量指定子が前のサブパターンの 1 回または 0 回の出現を意味するため):
    • \\s* - 0 個以上の空白
    • \\(.*\\)- リテラル(の場合、最後まで、改行以外のできるだけ多くの文字)
  • $- 文字列の終わり (実際の文字列が長くなる可能性があり、より小さな部分文字列を探している場合は削除します)。

IDEONE デモを見る

String str = "String prefix without commas, variable length remainder with optional suffix (optional suffix)";
Pattern ptrn = Pattern.compile("^([^,]*),([^()]*)(\\s*\\(.*\\))?$");
Matcher matcher = ptrn.matcher(str);
while (matcher.find()) {
    System.out.println("First group: " + matcher.group(1)
                  + "\nSecond group: " + matcher.group(1) 
                  + (matcher.group(3) != null ? 
                       "\nThrid group: " + matcher.group(3) : ""));
于 2015-09-24T21:35:35.133 に答える