2011-07-26 84 views
9

我有类似下面的字符串:正则表达式 - 捕捉所有重复的组

@[email protected] text [email protected]@another optional text here etc 

包含内部@[email protected]字符串。

我想捕获所有这些“变量”成组通过一个正则表达式匹配,但现在看来似乎是不可能的,因为正则表达式只返回最后捕获的组,而重复。

+0

要小心,你可能想'@^@] + @'而不是'@ + @' – sidyll

+0

我忘了正确的版本,它应该是“@。+?@ –

回答

17

你是对的;大多数正则表达式风格,包括Java,都不允许访问重复捕获组的单个匹配。 (Perl 6和.NET确实允许这样做,为了记录,但这不能帮助你)。

还有什么可以做什么?

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

,将捕获@[email protected]@[email protected]等一个接一个。

2

如果您知道的是,隔板将是@,那么为什么不直接使用split方法(string.split('@'))?

+0

这不是一个分离器它是一个启动属性/占位 –

+0

/结束“标签”那么,在这种情况下,不能你的'split'无论如何,遍历结果数组并捕获属性名称和可选的文本? – 2011-07-26 20:23:51

+0

你怎么能在下面的事例哪一个是属性,哪一个是文本:“@ property @ text”和“text @ property”.Split给你[“property”,“text”]或[“text”,property“]。 –