【问题标题】:Simple RegEx wierd result简单的 RegEx 奇怪的结果
【发布时间】:2013-12-17 07:35:08
【问题描述】:

我正在尝试用“.sss”替换所有出现的“S”(大写 S):

例如,下面一行甚至不包含大写字母 S,它仍然替换了很多:

 "MM/dd/yyyy EEEE hh:mm aa".replace(new RegExp('S*', 'g'),'.sss')

结果是:

".sssM.sssM.sss/.sssd.sssd.sss/.sssy.sssy.sssy.sssy.sss .sssE.sssE.sssE.sssE.sss .sssh.sssh.sss:.sssm.sssm.sss .sssa.sssa.sss"

没有任何想法..

(要测试此示例,只需将其复制并粘贴到任何页面上的 chrome 或 firefox 开发工具中并运行它)

【问题讨论】:

  • 应该是 new RegExp('S','g') 或者只是 /S/g, * 匹配任何东西。
  • 你为什么使用星号 (0-1) 量化器?只匹配一个。
  • 我也想匹配尾随 SSSS 的
  • 使用new RegExp('S+', '.sss')

标签: javascript regex


【解决方案1】:

那是因为*匹配0个或多个,所以你也匹配0个“S”的出现,意味着它匹配每个位置,其中“S”不在前面或后面(see it on Regexr)。改成

S+

see it on Regexr,甚至只有“S”。

+ Quantifier 匹配一个或多个。

【讨论】:

  • 是的,就是这样!不知道为什么我没看到。通常,当我写 X* 时,它位于更复杂的表达式的中间,并由表达式的其他部分强制执行
【解决方案2】:

使用RegExp('S+', 'g')

因为 * 匹配前一个字符的零次或多次。

“+”匹配字符至少 1 次,但也匹配更多次。

【讨论】:

    【解决方案3】:
    var res = str.replace(/S/g,".sss"); 
    

    试试这个。 Use this link

    【讨论】:

      【解决方案4】:

      * 量词在 0more 次之间匹配,尽可能多地匹配。因此,在这种情况下,它匹配字符串的每个字符位置。见what I mean

      您正在寻找+ 量词,意思是匹配1 或更多次。

      虽然由于您使用 g 修饰符(全局),但您可以简单地使用以下内容:

      "MM/dd/yyyy EEEE hh:mm aa".replace(/S/g, '.sss')
      // => "MM/dd/yyyy EEEE hh:mm aa"
      

      【讨论】:

      猜你喜欢
      • 2014-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多