【问题标题】:Javascript Regex matching strings separated by space but not containing a dotJavascript 正则表达式匹配由空格分隔但不包含点的字符串
【发布时间】:2014-10-22 04:14:22
【问题描述】:

我正在尝试匹配字符串中不以点分隔的单词。
因为 Javascript 中没有后视功能,所以我一直在为此苦苦挣扎,无法让它发挥作用。

测试字符串 1:'one two three.four five six.seven eight'
应该匹配:'one', 'two', 'five', 'eight'

测试字符串 2:'one.two three four.five six seven.eight'
应该匹配:'three', 'six'

更新:
测试字符串 3:'one.two three four five six seven.eight'
应该匹配:'three', 'four', 'five', 'six'

到目前为止,我有 ( |^)(\w+)( |$),它适用于测试字符串 2,但无法匹配 'two'

有什么方法可以用正则表达式做到这一点,还是应该将它拆分成一个数组然后遍历它?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    使用正则表达式( |^)\w+(?= |$)

    'one two three.four five six.seven eight'.replace(/( |^)\w+(?= |$)/g, '$1TEST')
    

    或者没有正则表达式(也许更具可读性)

    'one two three.four five six.seven eight'.split(' ').map(function(item) {
        if(item.indexOf('.') < 0)
            return 'TEST';
        return item;
    }).join(' ')
    

    【讨论】:

    • 这太完美了!谢谢! ?= 究竟是做什么的?
    • 而您的替代解决方案虽然优雅,但仅适用于 IE9+。为了安全起见,它会变得更加冗长,这就是我更喜欢正则表达式的原因。
    • Documentation for (?=) x(?=y) 仅当 x 后跟 y 时才匹配 x。如果您使用polyfill.map 也可以在 IE8 中工作
    【解决方案2】:

    通过引用组索引1来获取匹配的字符。

    (?:^| )([a-z]+(?= |$))
    

    DEMO

    > var re = /(?:^| )([a-z]+(?= |$))/g;
    undefined
    > var str = "one two three.four five six.seven eight";
    undefined
    > var matches = [];
    undefined
    > while (match = re.exec(str))
    ... matches.push(match[1]);
    4
    > console.log(matches);
    [ 'one', 'two', 'five', 'eight' ]
    

    【讨论】:

      【解决方案3】:

      您不需要使用复杂的正则表达式。 可以结合Array.filter()方法使用按空格分割:

      var result = str.split(' ').filter(function(item) {
          return item.indexOf('.') < 0;
      });
      

      【讨论】:

      • 谢谢!但我实际上需要这个来替换,所以我必须在之后重建字符串。当然你不知道,但这就是为什么我正在寻找一个有效的 RegEx。正如我在最后所说的那样,总是存在拆分然后遍历数组的后备。
      • @JanPaepke 要重建,请使用.join
      • 我知道,谢谢。 :) 正如我所说,我试图在不绕行数组的情况下找到解决方案。但似乎不可能……
      猜你喜欢
      • 2021-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-30
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多