匹配前面没有引号的模式

时间:2018-06-12 16:45:53

标签: regex pcre

我有这种模式(?<!')(\w*)\((\d+|\w+|.*,*)\),用于匹配字符串,如:

  • c(4)
  • hello(54, 41)

在SO上得到一些答案之后,我添加了一个负面的lookbehind,这样如果输入字符串前面有',那么字符串就不应该匹配。但是,它仍然部分匹配。

例如:

'c(4)会返回(4),即使它不应该匹配任何东西,因为负面的背后隐藏。

如果字符串前面有' NOTHING匹配,我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

由于没有人出现,我会把它扔出去让你开始。

此正则表达式将匹配

之类的内容

aa(a , sd,,,f,)
aa( as , " ()asdf)) " ,, df, , )
asdf()

但不是

'ab(s)

这将解决基本问题(?<!['\w])\w*
(?<!['\w])不允许引擎跳过单词char的情况 满足不引用 然后选择单词\w*来抓取所有单词 如果'aaa(引号在它之前,那么它将不匹配。

这个正则表达式点缀了我认为你想要实现的目标 在正则表达式的函数体部分。
一开始理解可能有点压倒性。

(?s)(?<!['\w])(\w*)\(((?:,*(?&variable)(?:,+(?&variable))*[,\s]*)?)\)(?(DEFINE)(?<variable>(?:\s*(?:"[^"\\]*(?:\\.[^"\\]*)*"|'[^'\\]*(?:\\.[^'\\]*)*')\s*|[^()"',]+)))

可读版本(通过:http://www.regexformat.com

 (?s)                          # Dot-all modifier

 (?<! ['\w] )                  # Not a quote, nor word behind
                               # <- This will force matching a complete function name
                               #    if it exists, thereby blocking a preceding quote '

 ( \w* )                       # (1), Function name (optional)
 \(
 (                             # (2 start), Function body
      (?:                           # Parameters (optional)
           ,*                            # Comma (optional)
           (?&variable)                  # Function call, get first variable (required)
           (?:                           # More variables (optional)
                ,+                            # Comma  (required)
                (?&variable)                  # Variable (required)
           )*
           [,\s]*                        # Whitespace or comma (optional)
      )?                            # End parameters (optional)
 )                             # (2 end)
 \)

 # Function definitions
 (?(DEFINE)
      (?<variable>                  # (3 start), Function for a single Variable
           (?:
                \s* 
                (?:                           # Double or single quoted string
                     "                            
                     [^"\\]* 
                     (?: \\ . [^"\\]* )*
                     "
                  |  
                     '                      
                     [^'\\]* 
                     (?: \\ . [^'\\]* )*
                     '
                )
                \s*     
             |                              # or,
                [^()"',]+                     # Not quote, paren, comma (can be whitespace)
           )
      )                             # (3 end)
 )