Как игнорировать пробелы в строке темы регулярного выражения? - PullRequest
89 голосов
/ 04 января 2011

Есть ли простой способ игнорировать пробелы в целевой строке при поиске совпадений с использованием шаблона регулярного выражения? Например, если мой поиск - «кошки», я бы хотел, чтобы «кошки» или «кошки» совпадали. Я не могу заранее удалить пробелы, потому что мне нужно найти начальный и конечный индексы совпадения (включая любые пробелы), чтобы выделить это совпадение, и любые пробелы должны присутствовать для форматирования.

Ответы [ 6 ]

102 голосов
/ 04 января 2011

Вы можете вставить дополнительные пробельные символы \s* между любыми другими символами в вашем регулярном выражении.Хотя и предоставлено, оно будет немного длинным.

/cats/ -> /c\s*a\s*t\s*s/

7 голосов
/ 11 марта 2012

Обращаясь к комментарию Стивена к ответу Сэма Дюфеля

Спасибо, похоже, это путь.Но я только что понял, что хочу только дополнительные символы пробела, если они следуют за новой строкой.Так, например, "c \ n ats" или "ca \ n ts" должны совпадать.Но не хотел бы, чтобы "c cts" совпадал, если нет новой строки.Любые идеи о том, как это может быть сделано?

Это должно сработать:

/c(?:\n\s*)?a(?:\n\s*)?t(?:\n\s*)?s/

См. эту страницу для всех различных вариаций "кошек"'что это соответствует.

Вы также можете решить это, используя условные выражения , но они не поддерживаются в разновидности регулярных выражений javascript.

4 голосов
/ 04 января 2011

Вы можете поместить \s* между каждым символом в строке поиска, поэтому, если вы ищете cat, вы должны использовать c\s*a\s*t\s*s\s*s

Это долго, но вы, конечно, можете динамически создавать строку.

Вы можете увидеть это здесь: http://www.rubular.com/r/zzWwvppSpE

3 голосов
/ 04 января 2011

Если вы хотите разрешить только пробелы, тогда

\bc *a *t *s\b

должен это сделать.Чтобы также разрешить вкладки, используйте

\bc[ \t]*a[ \t]*t[ \t]*s\b

Удалите якоря \b, если вы также хотите найти cats в таких словах, как bobcats или catsup.

2 голосов
/ 14 декабря 2018

Хотя принятый ответ технически верен, более практичный подход, если это возможно, состоит в том, чтобы просто убрать пробелы как из регулярного выражения, так и из строки поиска.

Если вы хотите искать «мои кошки» вместо:

myString.match(/m\s*y\s*c\s*a\*st\s*s\s*/g)

Просто сделай:

myString.replace(/\s*/g,"").match(/mycats/g)

Предупреждение: Вы не можете автоматизировать это в регулярном выражении, просто заменив все пробелы пустыми строками, потому что они могут возникать с отрицанием или иным образом сделать ваше регулярное выражение недействительным.

0 голосов
/ 25 мая 2018

Этот подход можно использовать для автоматизации этого (следующее примерное решение написано на python, хотя, очевидно, оно может быть перенесено на любой язык):

вы можете заранее удалить пробелы И сохранить позиции непробельных символов, чтобы вы могли использовать их позже, чтобы найти совпадающие позиции границ исходной строки, как показано ниже:

def regex_search_ignore_space(regex, string):
    no_spaces = ''
    char_positions = []

    for pos, char in enumerate(string):
        if re.match(r'\S', char):  # upper \S matches non-whitespace chars
            no_spaces += char
            char_positions.append(pos)

    match = re.search(regex, no_spaces)
    if not match:
        return match

    # match.start() and match.end() are indices of start and end
    # of the found string in the spaceless string
    # (as we have searched in it).
    start = char_positions[match.start()]  # in the original string
    end = char_positions[match.end()]  # in the original string
    matched_string = string[start:end]  # see

    # the match WITH spaces is returned.
    return matched_string

with_spaces = 'a li on and a cat'
print(regex_search_ignore_space('lion', with_spaces))
# prints 'li on'

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

И производительность этой функции, конечно же, также можно оптимизировать, этот пример просто показывает путь к решению.

...