Как игнорировать пробелы в строке темы регулярного выражения?
есть ли простой способ игнорировать пробел в целевой строке при поиске совпадений с использованием шаблона регулярного выражения? Например, если мой поиск для "кошек", я хотел бы "c ats" или "ca ts", чтобы соответствовать. Я не могу удалить пробелы заранее, потому что мне нужно найти начальный и конечный индекс соответствия (включая любые пробелы), чтобы выделить это соответствие, и любые пробелы должны быть там для целей форматирования.
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'
Если вы хотите пойти дальше, вы можете построить объект соответствия и вернуться это вместо того, чтобы, так что использование этого помощника будет более удобным.
и производительность этой функции, конечно, также может быть оптимизирована, этот пример просто показывает путь к решению.