【问题标题】:Regexp: only match word if it doesn't start with a dot [duplicate]正则表达式:仅匹配不以点开头的单词[重复]
【发布时间】:2017-12-10 07:44:03
【问题描述】:

假设我有这个字符串:

key something.key() (.key)(key)

我希望正则表达式只匹配 "[ ]" 内的单词 "keys"

[key] something.key() (.key)([key])

我目前使用过这个正则表达式 /(?!\.)key/g

但这仅排除点并且即使它以点开头仍然选择单词。

【问题讨论】:

  • 我应该更清楚。我只想匹配单词“word”而不是单词“something”。我将编辑帖子以使其更清晰
  • 怎么样:(^|[^\.])(key)
  • 问题是它也匹配 "(key" 而我希望它只匹配 "key"
  • 如果你使用 group(2) 它只会匹配“key”

标签: javascript regex regex-negation


【解决方案1】:

使用否定字符类匹配不是点

[^\.]

然后添加^ 以匹配不是点 字符串的开头

([^\.]|^)

?: 添加到组中,使其不被捕获。

(?:[^\.]|^)

最后添加一个匹配你的话的捕获组:

(?:[^\.]|^)(word)

您可以使用否定的后视获得相同的结果:

(?<!\.)word

唉,JavaScript 正则表达式没有实现它。

【讨论】:

  • 这是一个进步,但它也产生了我也遇到的另一个问题:正则表达式 (?:[^\.]|^)(word) 将选择 "(word" 作为匹配项,我希望它只选择“word”。或者如果一个字符串包含“/word”,那么正则表达式将选择整个“/word”而不仅仅是“word”。
  • 这就是为什么“word”在捕获组中。不要使用整个匹配。使用第一个捕获组——它不会包含“word”之前的字符。
  • 这是一个演示:jsfiddle.net/ft2o3apL/6
猜你喜欢
  • 1970-01-01
  • 2013-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多