Есть ли простой способ игнорировать пробел в целевой строке при поиске совпадений с использованием шаблона регулярного выражения? Например, если мой поиск для "кошек", я бы хотел, чтобы "c ats" или "ca ts" соответствовали. Я не могу заранее исключить пробелы, потому что мне нужно найти начальный и конечный индекс матча (включая любые пробелы), чтобы выделить это совпадение, и любые пробелы должны быть там для целей форматирования.
Как игнорировать пробелы в строке строки регулярного выражения?
Ответ 1
Вы можете прикреплять необязательные символы пробела \s*
между любыми другими символами в вашем регулярном выражении. Хотя он предоставлен, он будет немного длинным.
/cats/
→ /c\s*a\s*t\s*s/
Ответ 2
Адресация комментария Стивена к Сэму Дуфелю ответ
Спасибо, звучит так, как надо. Но я просто понял, что мне нужны только необязательные символы пробелов, если они следуют новой строке. Так, например, "c\n ats" или "ca\n ts" должны совпадать. Но не хотел бы, чтобы "c ats" соответствовали, если нет новой строки. Любые идеи о том, как это можно сделать?
Это должно сделать трюк:
/c(?:\n\s*)?a(?:\n\s*)?t(?:\n\s*)?s/
См. эту страницу для всех различных вариаций "кошек", которые это соответствует.
Вы также можете решить это, используя условные выражения, но они не поддерживаются в javascript-аромате регулярного выражения.
Ответ 3
Вы можете поместить \s*
между каждым символом в своей строке поиска, поэтому, если бы вы искали кошку, вы использовали бы c\s*a\s*t\s*s\s*s
Это долго, но вы можете построить строку динамически, конечно.
Вы можете увидеть, как он работает здесь: http://www.rubular.com/r/zzWwvppSpE
Ответ 4
Если вы хотите разрешить пробелы, то
\bc *a *t *s\b
должен это сделать. Чтобы также использовать вкладки, используйте
\bc[ \t]*a[ \t]*t[ \t]*s\b
Удалите привязки \b
, если вы также хотите найти cats
в словах типа bobcats
или catsup
.
Ответ 5
Этот подход можно использовать для автоматизации этого (следующее примерное решение на 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'
Если вы хотите пойти дальше, вы можете создать соответствующий объект и вернуть его вместо него, так что использование этого помощника будет более удобным.
И производительность этой функции, конечно, также может быть оптимизирована, этот пример просто показывает путь к решению.
Ответ 6
Хотя принятый ответ является технически правильным, более практичный подход, если это возможно, состоит в том, чтобы просто удалить пробелы как из регулярного выражения, так и из строки поиска.
Если вы хотите найти "мои кошки" вместо:
myString.match(/m\s*y\s*c\s*a\*st\s*s\s*/g)
Просто делать:
myString.replace(/\s*/g,"").match(/mycats/g)
Предупреждение: Вы не можете автоматизировать это в регулярном выражении, просто заменив все пробелы пустыми строками, потому что они могут возникнуть в отрицании или иным образом сделать ваше регулярное выражение недействительным.