Регулярное выражение: сопоставьте слово, содержащее специальные символы

#regex #match #special-characters #regex-negation #oniguruma

#регулярное выражение #сопоставьте #специальные символы #регулярное выражение-отрицание #онигурума

Вопрос:

В настоящее время я использую регулярное выражение oniguruma для поиска функций, подобных совпадениям, за исключением некоторых ключевых слов. Например, в строке «это test() и im() testing() thi[s]() this_[is]_a_fun(с некоторыми параметрами)»

регулярное выражение должно соответствовать: test , im , testing , thi[s]
this_[is]_a_fun Текущее регулярное выражение, которое я использую, является

 s*([A-z0-9w_] ).?(?=()(b(?<!if|while|for|return|else|elif|equals|or|xor|and|not|le|gre)) 
  

но это не соответствует thi[s] ни одной функции, содержащей скобки в слове.

Я попытался обновить регулярное выражение, чтобы сопоставить эти шаблоны с регулярным выражением

 s*([A-z0-9w_|[|]] ).?(?=()(b(?<!if|while|for|return|else|elif|equals|or|xor|and|not|le|gre)) 
  

но безрезультатно.

Буду признателен за любую помощь в сопоставлении таких шаблонов

Ответ №1:

Попробуйте это регулярное выражение:

 ([w []] )(?=([w ,]*))
  

ДЕМОНСТРАЦИЯ
Подробные сведения:

  • w соответствует любому символу слова (равному [a-zA-Z0-9_]) один или несколько раз
  • [ соответствует символу [ буквально
  • ] соответствует символу ] буквально
  • совпадает 1 или более раз
  • Положительный прогноз (?=([w ,]*)) буквально соответствует символам ( и любым символам из [w ,] и символа ) .
  • [w ,]* соответствует любому символу слова (равному [a-zA-Z0-9_]) и , нулю или более раз.

Комментарии:

1. @Bohemian $ соответствует началу ввода или началу строки в многострочном режиме.

2. @PedroRodrigues нет, наоборот: $ соответствует концу ввода или концу строки в многострочном

3. @Bohemian вы правы. Я имел в виду ^ . Тогда почему ваш первый вопрос?? И почему бы не исправить меня в вашем последнем, вместо того, чтобы просто указывать на ошибку?

4. Это регулярное выражение работает для строк типа «test()», но не в том случае, если параметры указаны в круглых скобках, например «test (with,params)». И я изменил регулярное выражение на s*([a-zA-Z[]_] ).*(?=() , которое действительно работало, пока я не попытался исключить ключевые слова, используя это регулярное s*([a-zA-Z[]_] ).*(?=()(b(?<!if|while|for|return|else|elif|equals|or|xor|and|not|le|gre)) выражение, но это не зафиксировало [], я думаю, это связано с b, но idk

5. @Custards1 обновил ответ, чтобы он соответствовал новой строке.