首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何迭代正则表达式

如何迭代正则表达式
EN

Stack Overflow用户
提问于 2013-05-29 22:45:56
回答 3查看 55.8K关注 0票数 33

假设我有以下字符串:

代码语言:javascript
复制
name1=gil;name2=orit;

我希望找到name=value的所有匹配项,并确保整个字符串都与该模式匹配。

因此,我做了以下工作:

  1. 确保整个模式与我想要的匹配。

模式p= Pattern.compile("^((\w+)=(\w+);)*$");匹配器m=p.matcher(行);if (!m.matches()) { return false;}

  • 迭代模式name=value

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

有没有什么方法可以用一个正则表达式来做到这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-29 23:03:26

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

\G来确保匹配之间没有不匹配的字符(例如,\G

  • 通过将字符串的长度与Matcher.end()进行比较来检查我们是否已到达上次匹配时的字符串末尾,后者返回匹配的最后一个字符之后的偏移量。

类似于:

代码语言:javascript
复制
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!");

Live demo

票数 39
EN

Stack Overflow用户

发布于 2013-05-29 22:52:16

您必须为"^“和"$”启用多行模式才能按预期工作。

代码语言:javascript
复制
Pattern p = Pattern.compile("^(?:(\\w+)=(\\w+);)*$", Pattern.MULTILINE);
while (m.find()) {
    for (int i = 0; i < m.groupCount() - 2; i += 2) {
        map.put(m.group(i + 1), m.group(i + 2));
    }
}

注释正确的地方,您仍然需要遍历每一行的匹配组,并将外部组设置为非捕获组(?:...)

票数 3
EN

Stack Overflow用户

发布于 2013-05-29 22:57:25

代码语言:javascript
复制
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));
    }
}

输出:

代码语言:javascript
复制
Whole String matched: name1=gil;name2=orit;
    Found: name1=gil;
    --> name is: gil
    Found: name2=orit;
    --> name is: orit
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16817031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档