34

次の文字列があるとしましょう:

name1=gil;name2=orit;

name=valueのすべての一致を検索し、文字列全体がパターンと一致することを確認したいと考えています。

だから私は次のことをしました:

  1. パターン全体が私が望むものと一致することを確認してください。

    Pattern p = Pattern.compile("^((\\w+)=(\\w+);)*$");
    Matcher m = p.matcher(line);
    if (!m.matches()) {
        return false;
    }
    
  2. パターンを繰り返すname=value

    Pattern p = Pattern.compile("(\\w+)=(\\w+);");
    Matcher m = p.matcher(line);
    while (m.find()) {
        map.put(m.group(1), m.group(2));
    }
    

1つの正規表現でこれを行う方法はありますか?

4

3 に答える 3

39

次の方法で、1 つの正規表現で一致を検証して反復処理できます。

  • 正規表現の先頭に a を配置することで、一致間に一致しない文字 (例: name1=x;;name2=y;)がないことを確認します。これは、「前の一致の終わり」を意味します。\G

  • 文字列の長さを と比較して、最後の一致で文字列の末尾に到達したかどうかを確認しますMatcher.end()。これは、最後に一致した文字の後のオフセットを返します。

何かのようなもの:

String line = "name1=gil;name2=orit;";
Pattern p = Pattern.compile("\\G(\\w+)=(\\w+);");
Matcher m = p.matcher(line);
int lastMatchPos = 0;
while (m.find()) {
   System.out.println(m.group(1));
   System.out.println(m.group(2));
   lastMatchPos = m.end();
}
if (lastMatchPos != line.length())
   System.out.println("Invalid string!");

ライブデモ

于 2013-05-29T15:03:26.030 に答える
0
String example = "name1=gil;name2=orit;";
Pattern pattern = Pattern.compile("((name[0-9]+?=(.+?);))+?");
Matcher matcher = pattern.matcher(example);
// verifies full match
if (matcher.matches()) {
    System.out.println("Whole String matched: " + matcher.group());
    // resets matcher
    matcher.reset();
    // iterates over found
    while (matcher.find()) {
        System.out.println("\tFound: " + matcher.group(2));
        System.out.println("\t--> name is: " + matcher.group(3));
    }
}

出力:

Whole String matched: name1=gil;name2=orit;
    Found: name1=gil;
    --> name is: gil
    Found: name2=orit;
    --> name is: orit
于 2013-05-29T14:57:24.720 に答える