我想匹配这样的东西
$(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)
。
显然我仍然会遗漏某些东西或误用任何东西,有什么建议吗?
答案 0 :(得分:2)
答案 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添加转义字符。