有关匹配和提取模式的建议吗?

时间:2015-08-28 17:17:02

标签: java regex

我想匹配这样的东西

$(string).not(string).not(string)

not(string)之后,$(string)可以重复零次或多次。 请注意,除了嵌套的not(string)之外,字符串可以是任何内容。

我使用正则表达式(\\$\\((.*)\\))((\\.not\\((.*?)\\))*?)(?!(\\.not)),我认为*?非贪婪地匹配not(string)的任意数量的序列,并使用前瞻来停止不匹配not(string),以便我只能提取我想要的部分。

然而,当我在输入上测试时

$(string).not(string).not(string).append(string)

group(0)返回整个字符串,我只需要$(string).not(string).not(string)

显然我仍然会遗漏某些东西或误用任何东西,有什么建议吗?

4 个答案:

答案 0 :(得分:2)

试试这个(为java转义):

cellForRowAtIndexPath:

它应该只捕获你所追求的部分。你can test it out(虽然没有转义为java)

答案 1 :(得分:2)

如果我们假设括号没有嵌套,你可以这样写:

string p = "\\$\\([^)]*\\)(?:\\.not\\([^)]*\\))*";

不需要添加前瞻,因为非捕获组具有贪婪的量词(因此该组会被重复)。

如果您在问题中调用的string可能是带有括号的带引号的字符串,如Pshemo示例中所示:$(string).not(".not(foo)").not(string),则可以将每个[^)]*替换为(?:\\s*\"[^\"]*\"\\s*|[^)]*)忽略引用部分内的字符。

答案 2 :(得分:0)

here开始,“组零表示整个模式”。使用group(1)

答案 3 :(得分:0)

(\$\([\w ]+\))(\.not\([\w ]+\))*

这也会有用,它会给你两个组,一个由带有$ sign的单词组成,另一个组将给你一组所有“.not”字符串。

请注意:您可能需要为java添加转义字符。