如何忽略正则表达式主题字符串中的空格?

当使用正则表达式模式搜索匹配时,是否有一种简单的方法来忽略目标字符串中的空白?例如,如果我的搜索是“ cat”,我希望“ c ats”或“ ca ts”匹配。我不能事先去掉空格,因为我需要找到匹配的开始和结束索引(包括任何空格) ,以便突出显示该匹配,并且为了格式化的目的,任何空格都需要存在。

306799 次浏览

可以在正则表达式中的每个其他字符之间插入可选的空格字符 \s*。虽然这是理所当然的,但它会变得有点冗长。

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

你可以把 \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

如果你还想在像 bobcatscatsup这样的单词中找到 cats,那么移除 \b锚。

针对史蒂文对萨姆 · 杜菲尔的回答的评论

谢谢,听起来就是这样。但是我刚刚意识到,我只需要可选的空白字符,如果他们遵循换行。例如,“ c n ats”或“ ca n ts”应该匹配。但是如果没有换行,就不希望“ c ats”匹配。有什么办法吗?

这应该会奏效:

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

请参阅 这一页了解所有与此匹配的“猫”的不同变体。

您也可以使用 条件句解决这个问题,但是它们在 regex 的 javascript 风格中不受支持。

这种方法可以用于 自动化这个 (下面的示例解决方案使用的是 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'

如果您想要更进一步,您可以构造 match 对象并返回它,这样使用这个 helper 会更方便。

而且这个函数的性能当然也是可以优化的,这个例子只是给出了一个解决的途径。

虽然公认的答案在技术上是正确的,但如果可能的话,一种更实际的方法是从正则表达式和搜索字符串中去除空格。

如果你想搜索“我的猫”,而不是:

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

只要做:

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

警告: 您不能仅仅用空字符串替换所有空格,从而在正则表达式上自动执行此操作,因为它们可能出现在否定中,否则会使正则表达式无效。

如果将动态值(如数组循环中的“当前值”)作为正则表达式测试值传递,则接受的答案将不起作用。如果输入可选的空白,就会得到一些非常难看的正则表达式。 因此,Konrad Hoffner 的解决方案在这种情况下更好,因为它将去除 rerest 和测试字符串中的空格。这个测试将会像两者都没有空格一样进行。