【问题标题】:Regular expression does not match what I would expect it to match正则表达式与我期望的不匹配
【发布时间】:2010-11-22 23:08:59
【问题描述】:

考虑下面的 Javascript 正则表达式匹配操作:

"class1 MsoClass2\tmsoclass3\t MSOclass4 msoc5".match(/(^|\s)mso.*?(\s|$)/ig);

我希望它返回[" MsoClass2\t", "\tmsoclass3\t", " MSOclass4 ", " msoc5"]。相反,它返回[" MsoClass2\t", " MSOclass4 "]

为什么?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    因为第一个匹配消耗了制表符,所以在第二个 MSO 字符串之前没有留下空白字符。与第二场比赛后的空格相同。

    也许您想匹配单词边界而不是分隔字符。这段代码:

    "class1 MsoClass2\tmsoclass3\t MSOclass4 msoc5".match(/\bmso.*?\b/ig)
    

    会给你这个结果:

    ["MsoClass2","msoclass3","MSOclass4","msoc5"]
    

    【讨论】:

    • 不知道 \b 通配符;非常优雅!
    【解决方案2】:

    msoclass3 之前的制表符已被第一个匹配项 " MsoClass2\t" 占用。也许您想改用非消耗性的前瞻断言:

    /(^|\s)mso[^\s]*(?=\s|$)/
    

    【讨论】:

      【解决方案3】:

      因为一旦匹配了" MsoClass2\t",匹配器就会查看msoclass3中的m,这与初始空间不匹配。

      【讨论】:

        【解决方案4】:

        这是因为您使用 ^ OR \s(whitespace) 进行第一次匹配,而字符串没有第 3 类的空格。要获得所需的结果,请在 match() 中使用以下内容:

        /mso.*?(\s|$)/ig
        

        【讨论】:

          【解决方案5】:

          我不确定你是否可以首先使用 (^|\s)(\s|$) 之类的东西——也许你可以,但我必须想明白这个正则表达式——而且当有人不得不思考理解一个正则表达式:这些通常太复杂了:-(


          如果你想匹配以“mso”开头的单词,无论是大写还是小写,我可能会使用这样的东西:

          "class1 MsoClass2\tmsoclass3\t MSOclass4 msoc5".match(/\s?(mso[^\s]*)\s?/ig);
          

          这让你:

          [" MsoClass2 ", "msoclass3 ", " MSOclass4 ", "msoc5"]
          

          这就是您所要求的(几乎:有几个空格差异)。

          或者,更简单:

          "class1 MsoClass2\tmsoclass3\t MSOclass4 msoc5".match(/(mso[^\s]*)/ig);
          

          这让你:

          ["MsoClass2", "msoclass3", "MSOclass4", "msoc5"]
          

          没有空格。


          也更容易阅读/理解;-)

          【讨论】:

          • @Nerdling:谢谢。 (这就是我所说的“不得不思考”^^)
          猜你喜欢
          • 2023-02-14
          • 1970-01-01
          • 2011-07-24
          • 2015-10-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-23
          • 2017-12-04
          相关资源
          最近更新 更多