【问题标题】:Regex remove trailing e (except for all 2 and 3 letter words)正则表达式删除尾随 e(所有 2 和 3 个字母单词除外)
【发布时间】:2020-07-09 13:15:09
【问题描述】:

我正在尝试编写一个简单的正则表达式,它将删除字符串中除 2 和 3 个字母单词之外的所有单词中的尾随 'e' 字符。 以下解决方案将正确找到单词,但会匹配完整的单词,而不仅仅是 'e'。

/\b\w{2,}e\b/

我无法将建议的解决方案与前瞻组(使用“(?=)”)结合起来正常工作。

【问题讨论】:

  • this 有帮助吗?

标签: javascript regex string


【解决方案1】:

使用回顾:

(?<=\w\w\w)e\b

【讨论】:

  • regexpal 返回错误“JS 不支持lookbehind”,但是,我尝试在节点中运行它并且它可以工作。
  • @nejc:目前,仅在 IE 和 Safari 中不支持lookbehind,请参阅:caniuse.com/#feat=js-regexp-lookbehind
  • 我们可以使用重复弹药 '{}' 而不是 \w\w\w 吗?如果我们尝试匹配更长的单词(比如长度 15+),代码会变得很难看...
  • @Nejc:是的,当然,你可以写\w{3}或者任意数量的字母,意思完全一样。
  • 我试过了,但它不起作用regex101.com/r/11HFUh/12
【解决方案2】:

如果要匹配除第一个、第二个或第三个字符之外的单词中的训练 e 字符,您可以捕获 1-3 个单词字符,然后匹配尽可能少的单词字符并匹配尾随的 e 字符。

\b(\w{1,3}\w*?)e*\b

Regex demo

在替换使用组1中。

要删除单个 e,请将 e* 更改为 e?

[
  "theeeeeeeee",
  "the",
  "te",
  "ee",
  "eee",
  "eeee",
  "abcdefeee",
  "ehteheeee",
].forEach(s => console.log(s.replace(/\b(\w{1,3}\w*?)e*\b/, "$1")))

如果您不必考虑开头的单词边界,您可以捕获 3 个单词字符并在结尾匹配单个 e。

(\w{3})e\b

Regex demo

[
  "thee",
  "the",
  "te",
  "ee",
  "eee",
  "eeee",
  "abcdefeee",
  "ehteheeee",
].forEach(s => console.log(s.replace(/(\w{3})e\b/, "$1")))

【讨论】:

  • @Mandy8055 (?=.{4,})e+$ 中的断言在每个位置上运行。在feee 之前,断言为真,但不能匹配e+$,因为还有一个f
猜你喜欢
  • 2020-02-16
  • 1970-01-01
  • 2016-12-02
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
相关资源
最近更新 更多