Нужен эксперт по регулярным выражениям: круглая скобка внутри строки - PullRequest
0 голосов
/ 16 сентября 2010

Я ищу строки в строках, используя Regex.Шаблон представляет собой строковый литерал, который заканчивается на (, например,

# pattern
" before the bracket ("

# string
this text is before the bracket (and this text is inside) and this text is after the bracket

Я знаю, что шаблон будет работать, если я экранирую символ с обратной косой чертой, то есть:

# pattern
" before the bracket \\("

Ностроки шаблона приходят из другого поиска, и я не могу контролировать, какие символы будут и где.Есть ли способ избежать целого строкового литерала, чтобы что-нибудь между маркерами считалось строкой?Например:

# pattern
\" before the ("

Единственный другой вариант, который у меня есть, это сделать замену, добавив escape-символы для каждого защищенного символа.


re.escape - это именно то, что мне нужно.Я использую регулярное выражение в Access VBA, который не имеет этого метода.У меня есть только методы замены, выполнения или тестирования.

Есть ли способ избежать всего, что находится внутри строки в VBA?

Спасибо

Ответы [ 4 ]

2 голосов
/ 16 сентября 2010

Вы не указали язык, но он выглядит как Python, поэтому, если у вас есть строка в Python, специальные символы регулярных выражений которой вам нужно экранировать, используйте re.escape():

>>> import re
>>> re.escape("Wow. This (really) is *cool*")
'Wow\\.\\ This\\ \\(really\\)\\ is\\ \\*cool\\*'

Обратите внимание, что пробелы тоже экранированы (возможно, чтобы гарантировать, что они все еще работают в re.VERBOSE регулярном выражении).

1 голос
/ 17 сентября 2010

Может быть написать свою собственную функцию выхода VBA:

Function EscapeRegEx(text As String) As String
    Dim regEx As RegExp
    Set regEx = New RegExp

    regEx.Global = True
    regEx.Pattern = "(\[|\\|\^|\$|\.|\||\?|\*|\+|\(|\)|\{|\})"

    EscapeRegEx = regEx.Replace(text, "\$1")
End Function
0 голосов
/ 17 сентября 2010

Я почти уверен, что с ограничениями возможностей RegExp в VBA / VBScript вам придется заменить специальные символы в вашем шаблоне перед его использованием. Похоже, в нем нет ничего встроенного, как в Python.

0 голосов
/ 16 сентября 2010

Следующее регулярное выражение будет захватывать все от начала строки до первого (.Первая захваченная группа $1 будет содержать часть перед (.

^([^(]+)\(

В зависимости от вашего языка, вам, возможно, придется экранировать ее как:

"^([^(]+)\\("
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...