Javaの正規表現:同じライン上のキャプチャ複数の一致

オマリセレスティン:

私は、同じライン上の1つのまたは複数の変数の値の割り当てにマッチする正規表現式を作成しようとしています。私は、次の式を使用しています:

([a-z][a-zA-Z0-9-]*)=(('(\'|[^\'])*')|("(\"|[^"])*"))

例えば、私は、入力として次の文字列を持っている場合:

a="xyz" b="hello world"

そして、次のコードを使用:

Matcher matcher = rules.get(regex).matcher(input);
int start = 0;

while (matcher.find(start)) {
    System.err.println(matcher.group(0));

    start = matcher.end();
}

それは私に2つの別々の結果を与える必要があります:

1. a="xyz"
2. b="hello world"

しかし、それは一つだけ、入力文字列全体を返します。

a="xyz" b="hello world"

それは取っているように見えるxyz" b="hello world内側の一部として。私はこれをどのように解決することができますか?

Wiktor第Stribiżav:

あなたは使用することができます

(?s)([a-z][a-zA-Z0-9-]*)=(?:'([^\\']*(?:\\.[^\\']*)*)'|"([^"\\]*(?:\\.[^"\\]*)*)")

参照してください。正規表現のデモを

Javaでは、

String regex = "(?s)([a-z][a-zA-Z0-9-]*)=(?:'([^\\\\']*(?:\\\\.[^\\\\']*)*)'|\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\")";

細部

  • (?s)-インラインPattern.DOTALL一致があること、埋め込みフラグオプション.すぎ、改行文字を一致させます
  • ([a-z][a-zA-Z0-9-]*) - グループ1
  • = - 等号
  • (?:'([^\\']*(?:\\.[^\\']*)*)'|"([^"\\]*(?:\\.[^"\\]*)*)") - 二つの選択肢の非キャプチャグループの一致1:
    • '([^\\']*(?:\\.[^\\']*)*)'- '次いで以外の文字の任意の量\および'任意のエスケープシーケンスの0+反復が続くは以外0+文字が続く\'
    • | - または
    • "([^"\\]*(?:\\.[^"\\]*)*)"- "次いで以外の文字の任意の量\および"任意のエスケープシーケンスの0+反復が続くは0+以外の文字が続く\"

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=25371&siteId=1