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


107

使用正则表达式模式搜索匹配项时,是否有一种简单的方法可以忽略目标字符串中的空格?例如,如果我搜索的是“猫”,则希望匹配“猫”或“猫”。我无法预先去除空格,因为我需要找到匹配项的开始和结束索引(包括任何空格)以突出显示该匹配项,并且任何空格都需要用于格式化。

Answers:


124

您可以\s*在正则表达式中的每个其他字符之间插入可选的空白字符。虽然获得批准,但会有点冗长。

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


谢谢,听起来像是要走的路。但是我才意识到,我只需要可选的空格字符(如果它们遵循换行符)。因此,例如,“ c \ n ats”或“ ca \ n ts”应该匹配。但是如果没有换行符,不希望“ c ats”匹配。关于如何做到的任何想法?
史蒂文

@Steven,请参阅下面的内容,您可以轻松地将我的解决方案调整为适合此类特定情况。
鲍勃

@chris我认为,此正则表达式仅对猫非常严格,它也可以编写任何类似这样的字母搜索: ^([a-z]\s*)+$
Sandeep Kaur

9

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

谢谢,听起来像是要走的路。但是我才意识到,我只需要可选的空格字符(如果它们遵循换行符)。因此,例如,“ c \ n ats”或“ ca \ n ts”应该匹配。但是如果没有换行符,不希望“ c ats”匹配。关于如何做到的任何想法?

这应该可以解决问题:

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

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

您还可以使用条件来解决此问题,但是regex的javascript风格不支持它们。


3
太难看了。肯定有更好的办法。
james.garriss 2015年

您可以通过以下方式使它在JS语法中更具可读性(尽管该技术也可以在其他语言中使用):new RegExp('cats'.split('').join('(?:\n\s*)?'))
brianary

7

尽管从技术上来说,可接受的答案是正确的,但如果可能的话,一种更实用的方法是将正则表达式和搜索字符串中的空格都去除。

如果您要搜索“我的猫”,而不是:

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

做就是了:

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

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


5

您可以\s*在搜索字符串中的每个字符之间插入一个字符,这样,如果您要寻找猫,就可以使用c\s*a\s*t\s*s\s*s

它很长,但是您当然可以动态地构建字符串。

您可以在这里看到它的工作:http : //www.rubular.com/r/zzWwvppSpE


3

如果您只想允许空格,那么

\bc *a *t *s\b

应该这样做。要同时允许标签,请使用

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

\b如果您还想cats在诸如bobcats或的词中查找,请删除锚点catsup


1

该方法可用于实现这一目的的自动化(以下示例性解决方案在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对象并返回它,因此使用此帮助程序将更加方便。

当然,也可以优化此功能的性能,此示例仅用于说明解决方案的路径。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.