【问题标题】:Regexp: is it possible to search for string 'string' but not 'string({'正则表达式:是否可以搜索字符串 'string' 但不能搜索 'string({'
【发布时间】:2010-01-11 09:37:58
【问题描述】:

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

例子:

  • 不推荐使用的 api:方法(a,b,c)
  • 新的 api:方法({a:a, b:b, c:c})

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

谢谢。

【问题讨论】:

  • 类似method([^{]?或者 method\s*(\s*[^{] 如果你想允许空格。另外,我建议查看regular-expressions.info 的教程 - 每个程序员都应该知道基本的正则表达式!

标签: regex match


【解决方案1】:

我想说正确的方法是使用负前瞻运算符?!

/method(?!\(\{)/

上述声明,“method 的任何出现不是后跟({

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

【讨论】:

  • 正确;我的版本只匹配method( 而不是method;这就是我 认为 OP 想要的,但这个问题有点模棱两可。如果我们专门寻找函数调用,大多数语言都需要(,因此包含它会捕获函数调用,而不是(例如)包含单词method的cmets
  • 并且,为了确保我们不会被空格所迷惑,您可以使用/method(?!\s*\(\s*\{)/
  • 我很好奇doesn't handle the combination of the two characters。你能详细说明一下吗?
  • @James:是的,我找不到一个好的表达方式,但我指的是你在之前的评论中提到的内容,它匹配 method( 而不是 {而不是method 后面没有({,如果正则表达式确实需要找到所有不是method({method 出现,那么假设method( 会错过所有潜在的其他出现method_
【解决方案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` 在大多数正则表达式实现中)

【讨论】:

    【解决方案3】:

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

    /method\([^{]/
    

    【讨论】:

    • 除了我在自己的回复中评论过的内容之外,( 需要在您的正则表达式中转义。
    猜你喜欢
    • 2011-07-28
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    相关资源
    最近更新 更多