正则表达式 - 捕获所有重复组

10

我有以下字符串:

@property.one@some text here@property.two@another optional text here etc

这段文本包含着 @.+?@ 字符串。

我想通过一个正则表达式匹配捕获所有这些 "变量" 到分组里,但是看起来不可能,因为正则表达式只返回最后一次重复匹配捕获的分组。


小心,你可能想要使用 @[^@]+@ 而不是 @.+@ - sidyll
我忘记放正确的版本了,应该是"@.+?@。 - Krzysztof Wolny
2个回答

17

你说得对;大多数正则表达式引擎,包括Java在内,都不允许访问重复捕获组的单个匹配项。(值得一提的是,Perl 6和.NET允许这样做,但这并不能帮到你)。

还有什么其他办法呢?

Pattern regex = Pattern.compile("@[^@]+@");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    // matched text: regexMatcher.group()
    // match start: regexMatcher.start()
    // match end: regexMatcher.end()
} 

这将一个一个地捕获@property.one@@property.two@等。


2

如果你知道分隔符是 @,为什么不直接使用 split 方法 (string.split('@'))?


这不是一个分隔符,而是属性/占位符的起始/结束“标记”。 - Krzysztof Wolny
那么,在这种情况下,你无论如何都可以执行split,遍历结果数组并捕获属性名称和可选文本,对吧? - user554546
在下面的例子中,你怎么知道哪一个是属性,哪一个是文本:"@property@text" 和 "text@property"。使用 Split 函数可以得到 ["property", "text"] 或者 ["text", "property"]。 - Krzysztof Wolny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接