如何迭代正则表达式

gil*_*las 27 java regex

假设我有以下字符串:

name1=gil;name2=orit;
Run Code Online (Sandbox Code Playgroud)

我想找到所有匹配项,name=value并确保整个字符串与模式匹配.

所以我做了以下事情:

  1. 确保整个模式符合我的要求.

    Pattern p = Pattern.compile("^((\\w+)=(\\w+);)*$");
    Matcher m = p.matcher(line);
    if (!m.matches()) {
        return false;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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));
    }
    
    Run Code Online (Sandbox Code Playgroud)

有没有办法用一个正则表达式做到这一点?

Duk*_*ing 33

您可以通过以下方式验证和迭代匹配一个正则表达式:

  • 确保匹配之间没有不匹配的字符(例如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!");
Run Code Online (Sandbox Code Playgroud)

现场演示.


有些语言可能允许您直接迭代单个匹配
^((\\w+)=(\\w+);)*$,但我不相信您可以在Java中执行此操作.