Javascript 如何匹配'+;abc&x27;但不是'++;abc&x27;不回头看?

Javascript 如何匹配'+;abc&x27;但不是'++;abc&x27;不回头看?,javascript,regex,Javascript,Regex,在一句类似于: Lorem ipsum+dolor+sit amet 我想匹配+dolor,但不想匹配+sit。我可以通过lookback来实现,但是由于JavaScript不支持它,我正在努力为它构建一个模式 到目前为止,我已经尝试过: (?:\+(.+?))(?=[\s\.!\!]) - but it matches both words (?:\+{1}(.+?))(?=[\s\.!\!]) - the same here - both words are matched 令我惊讶的是,

在一句类似于:

Lorem ipsum+dolor+sit amet

我想匹配
+dolor
,但不想匹配
+sit
。我可以通过lookback来实现,但是由于
JavaScript
不支持它,我正在努力为它构建一个模式

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

(?:\+(.+?))(?=[\s\.!\!]) - but it matches both words
(?:\+{1}(.+?))(?=[\s\.!\!]) - the same here - both words are matched
令我惊讶的是,这样的模式:

(?=\s)(?:\+(.+?))(?=[\s\.!\!])
什么都不匹配。我想我可以把它骗出来,然后在
+
符号前使用
\s
或更高版本的
^
,但它似乎不是这样工作的


编辑-背景信息:

这不一定是问题的一部分,但有时知道这些都有什么好处是很好的,因此,请澄清一些问题/评论,并做一个简短的解释:

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

只需使用以下正则表达式即可:

(^|\s)\+\w+

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

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

测试一下

说明:

(?:#匹配(但不捕获)
^#字符串开头的位置
|#或
[^+]#除+以外的任何字符。
)#小组结束
(#匹配(并在第1组中捕获)
\+#a+字符
[^\s+!]+#除[+.!]或空格外的一个或多个字符。
)#小组结束
从捕获组1获取内容。正则表达式使用所描述的技巧

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

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

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

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


我想这就是你需要的

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

但是这也与前面的空格相匹配。@AvinashRaj:我认为这并不重要-文本无论如何都可以通过捕获组获得。但是你的正则表达式也与这个
foo+dolor
字符串中的
+bar
匹配。你想在
foo+bar
中匹配
+bar吗?不,这是一个句子,不会出现这种情况。在
+
之前总是会有一个空格
\s
^
。那么为什么你会接受在
foo+bar
中捕获
+bar
的答案呢?因为
foo+bar
将是一个打字错误,无论如何都需要更正。就好像我写的是我的房间而不是我的房间一样。@AvinashRaj,你可能知道,在这种情况下,接受哪个答案并不总是容易或明显的。我选择了@TimPietzcker的答案,因为尽管它并不完美(就像你说的,它匹配了太多的情况),但它解释了在一个单词前只匹配一个
+
的诀窍。毕竟,我把他的答案和@hsz的答案与我自己的模式混合在一起,然后解决了它。我们需要另一个选项,如部分答案;-)很难找到一个答案,但我认为这一条指引了我正确的方向,我将使用类似于
(?:^\s)(\+([^+\s]+)(?=[\s\.!!])
的模式,这是两种模式的组合。在开始时匹配额外的字符就可以了。我添加了另一个组,因为我以后需要替换它,所以它解决了这个特殊的问题。不管是谁做的,显然不知道捕获和不捕获匹配之间的区别@t3chb0t我认为你应该接受这个答案,因为它不会遇到类似于
+dolor+sit
(我只能找到
+dolor
)的相邻比赛的问题。@TimPietzcker他必须用其他东西替换捕获的。因此,urs可能更好地替换,这需要更多的努力。
\+\++|(\+\S+)
var re = / (\+[a-zA-Z0-9]+)/  // Note the space after the '/'
(?:^|\s)(\+[^+\s.!]*)(?=[\s.!])