【问题标题】:RegEx for match whole word in sentences - javascript正则表达式匹配句子中的整个单词 - javascript
【发布时间】:2020-08-25 17:02:40
【问题描述】:

尝试找出在一系列字符串中查找“s***”的正确正则表达式,例如:

match for "find s*** in s*** foobar"
match for "s***"
don't match for "s******"
don't match for "s****** foobar"

我使用匹配是因为我想计算句子中匹配实例的数量。我尝试将“s*{3}”作为起点,并尝试使用 $ 和 \b 或 \B 的变体,但我无法完全弄清楚。

我在这里创建了一些测试来尝试一下,如果这有帮助的话。

https://regex101.com/r/VdLyOY/2

【问题讨论】:

  • 你不能用空格分割字符串吗?
  • 您可以使用/\bs\*{3}(?!\*)/g
  • 我假设你有四个字符的单词,所以在第四个字符之后你必须有空格,所以正则表达式就像 /[s]*{3}(?=\s)/g

标签: javascript regex


【解决方案1】:

您可以将此正则表达式与负前瞻一起使用:

/\bs\*{3}(?!\*)/g

RegEx Demo

或具有积极的前瞻性:

/\bs\*{3}(?=\s|$)/g

正则表达式详细信息:

  • \bs:匹配单词边界后的字母s
  • \*{3}:匹配* 3 次,即***
  • (?!\*):否定前瞻断言我们没有 * 提前
  • (?=\s|$):肯定的前瞻断言我们在下一个位置有一个空格或行尾

【讨论】:

  • 我认为正向预读版本有效,但负预读版本匹配 s***s 并且不应该。我不认为积极的前瞻与我为这个特定问题发布的相比没有帮助。我喜欢你的解释!
  • 目前还不清楚s***s 是否不应该匹配,但我为此添加了一个积极的前瞻版本。
【解决方案2】:

/\bs\*{3}(\s|$)/g 可能会起作用,具体取决于您的标准。

【讨论】:

    【解决方案3】:

    使用

    /\bs\*{3}\B(?!\*)/g
    

    proof

    解释

                             EXPLANATION
    --------------------------------------------------------------------------------
      \b                       the boundary between a word char (\w) and
                               something that is not a word char
    --------------------------------------------------------------------------------
      s                        's'
    --------------------------------------------------------------------------------
      \*{3}                    '*' (3 times)
    --------------------------------------------------------------------------------
      \B                       the boundary between two word chars (\w)
                               or two non-word chars (\W)
    --------------------------------------------------------------------------------
      (?!                      look ahead to see if there is not:
    --------------------------------------------------------------------------------
        \*                       '*'
    --------------------------------------------------------------------------------
      )                        end of look-ahead
    

    【讨论】:

    • @JoeHildebrand (?!\*) 解决了这个问题。
    • @GarrettMotzner (?!\*) 解决了这个问题。
    猜你喜欢
    • 2014-11-22
    • 2010-11-15
    • 2012-01-06
    • 2010-12-29
    • 2013-01-23
    • 2011-08-07
    相关资源
    最近更新 更多