如何在不回头的情况下匹配“+abc”而不是“++abc”

How to match '+abc' but not '++abc' without lookbehind?

本文关键字:++abc +abc 回头 情况下      更新时间:2023-09-26

在类似于以下内容的句子中:

Lorem ipsum +dolor ++sit amet.

我想匹配+dolor,但不想匹配++sit.我可以通过回顾来做到这一点,但由于JavaScript不支持它,我正在努力为它建立一个模式。

到目前为止,我已经尝试过:

(?:'+(.+?))(?=['s'.!'!]) - but it matches both words
(?:'+{1}(.+?))(?=['s'.!'!]) - the same here - both words are matched

令我惊讶的是,这样的模式:

(?='s)(?:'+(.+?))(?=['s'.!'!])

不匹配任何东西。我以为我可以把它骗出来并使用's或以后的^,在+符号之前,但它似乎不是那样工作的。


编辑 - 背景信息:

这不一定是问题的一部分,但有时很高兴知道这一切有什么好处,所以澄清你的一些问题/评论一个简短的解释:

  • 任何顺序中的任何单词都可以用+++
  • 标记
  • 每个单词及其标记稍后将替换为<span>
  • lorem+ipsum 这样的情况被认为是无效的,因为它就像拆分一个单词 (ro+om) 或将两个单词写成一个单词 (myroom),所以无论如何都必须更正(模式可以匹配这一点,但这不是错误)但是它至少应该匹配上面示例中的正常情况
  • 我使用像(?=['s'.!'!])这样的前瞻,这样我就可以匹配任何语言的单词,而不仅仅是'w的字符

一种方法是匹配一个额外的字符并忽略它(通过将匹配的相关部分放入捕获组中):

(?:^|[^+])('+[^'s+.!]+)

但是,如果潜在的匹配项可以直接彼此相邻,则这种情况就会崩溃。

在 regex101.com 上实时测试。

解释:

(?:         # Match (but don't capture)
 ^          # the position at the start of the string
|           # or
 [^+]       # any character except +.
)           # End of group
(           # Match (and capture in group 1)
 '+         # a + character
 [^'s+.!]+  # one or more characters except [+.!] or whitespace.
)           # End of group
'+'+|('+'S+)

从捕获组 1 中获取内容。正则表达式使用此答案中描述的技巧。

正则表达式101演示

var re = /'+'+|('+'S+)/g;
var str = 'Lorem ipsum +dolor ++sit ame';
var m;
var o = [];
while ((m = re.exec(str)) != null) {
    if (m.index === re.lastIndex) {
        re.lastIndex++;
    }
    if (m[1] != null) {
        o.push(m[1]);
    }
}

如果您有类似 +++donor 的输入,请使用:

'+'++|('+'S+)

以下正则表达式似乎对我有用:

var re = / ('+[a-zA-Z0-9]+)/  // Note the space after the '/'

演示

https://www.regex101.com/r/uQ3wE7/1

我认为这就是你需要的。

(?:^|'s)('+[^+'s.!]*)(?=['s.!])

只需尝试使用以下正则表达式:

(^|'s)'+'w+