如何匹配' + abc'但不是' ++ abc'没有后仰?

时间:2015-01-14 11:12:09

标签: javascript regex

在类似于:

的句子中
  

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个字符

5 个答案:

答案 0 :(得分:3)

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

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

但是,如果潜在的匹配可能彼此直接相邻,则会发生故障。

测试live on 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

答案 1 :(得分:3)

\+\+|(\+\S+)

抓取捕获组1中的内容。正则表达式使用in this answer描述的技巧。

Demo on regex101

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+)

答案 2 :(得分:1)

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

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

演示

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

答案 3 :(得分:1)

我认为这就是你所需要的。

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

答案 4 :(得分:0)

试试以下正则表达式:

(^|\s)\+\w+