Как игнорировать пробелы в строке темы регулярного выражения?


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

5 83

5 ответов:

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

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

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

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

Это должно сделать трюк:

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

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

вы также можете решить эту проблему с помощью условия, но они не поддерживаются в JavaScript аромат тестирую.

вы могли бы поставить \s* между каждым символом в строке поиска, так что если вы искали кота вы бы использовали c\s*a\s*t\s*s\s*s

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

вы можете видеть, что он работает здесь:http://www.rubular.com/r/zzWwvppSpE

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

\bc *a *t *s\b

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

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

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

этот подход может быть использован для автоматизация этот (следующее примерное решение находится в 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'

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

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