Regexp:是否可以搜索字符串'string'而不是'string({'

时间:2010-01-11 09:37:59

标签: regex match

我试图在目录中的所有文件中查找我的具体单词(使用已弃用的API的方法调用)的所有出现。我需要一个regexp来查找不包含更新调用的所有此类事件(新API)。你能帮帮我吗?

示例:

  • 弃用的api:方法(a,b,c)
  • new api:method({a:a,b:b,c:c})

正则表达式应该找到所有包含'method'的文件,而不是'method({'。

谢谢。

3 个答案:

答案 0 :(得分:2)

betelgeuse:tmp james$ echo " method(a,b,c) "> test1
betelgeuse:tmp james$ echo " method(a,b,c) " > test3
betelgeuse:tmp james$ echo " method({a:a, b:b, c:c})" > test2
betelgeuse:tmp james$ grep "method([^{]" test*
test1: method(a,b,c) 
test3: method(a,b,c) 

解释:[ ]定义一个字符类 - 即,此位置的字符可以匹配类中的任何内容。

^作为类的第一个字符是否定:它表示此类匹配任何字符,除了此类中定义的字符。

{当然是我们关心的唯一一个在这种情况下不匹配的角色。

所以在某些字符串中,这将匹配任何字符method(后跟任何字符的字符串,但 {除外。

还有其他方法可以做到这一点:

betelgeuse:tmp james$ grep "method(\w" test*
test1: method(a,b,c) 
test3: method(a,b,c)
在这种情况下,

\w(假设C语言环境)等同于[0-9A-Za-z]。如果您想允许可选空格,可以尝试:

betelgeuse:tmp james$ grep "method([[:alnum:][:space:]]" test*
test1: method(a,b,c) 
test3: method( a, b, c) 
betelgeuse:tmp james$ 

(在大多数正则表达式实现中,使用grep语法,[:alnum:] is the same as \ w ; [:space:] refers to any whitespace character - this is represented as \ s`

答案 1 :(得分:2)

我认为正确的方法是使用负向前瞻操作符?!

/method(?!\(\{)/

以上陈述“任何<{1}} <{1}}

它比建议的method更符合您的要求,因为后者与字符串结尾不匹配(即({)并且它不处理您的两个字符/method([^{]/的组合要求很好。

答案 2 :(得分:1)

您可以使用character classes排除以下 {,例如

/method\([^{]/