Совпадение с шаблоном, которому не предшествует кавычка - PullRequest
0 голосов
/ 12 июня 2018

У меня есть этот шаблон (?<!')(\w*)\((\d+|\w+|.*,*)\), который должен соответствовать таким строкам, как:

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

После некоторыхответы на SO, я добавил отрицательный взгляд сзади, так что если перед входной строкой предшествует ', строка не должна совпадать вообще.Тем не менее, он по-прежнему частично совпадает.

Например:

'c(4) возвращает (4), даже если он не должен совпадать с чем-либо из-за негативного взгляда сзади.

Каксделать так, если строке предшествует ' НИЧЕГО совпадения?

1 Ответ

0 голосов
/ 13 июня 2018

Так как никто не пришел, я выкину это, чтобы вы начали.

Это регулярное выражение будет соответствовать таким вещам, как

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)
 )
...