【问题标题】:Regular expression works on regex101.com, but not on prod正则表达式适用于 regex101.com,但不适用于 prod
【发布时间】:2017-01-30 20:37:20
【问题描述】:

https://regex101.com/r/sB9wW6/1

(?:(?<=\s)|^)@(\S+)

prod:(?:\s|^)@(\S+) 上这样工作,但我需要一个正确的起始索引(没有空格)。

这里是 JS:

var regex = new RegExp(/(?:(?<=\s)|^)@(\S+)/g);

解析正则表达式时出错:正则表达式无效: /(?:(?

我做错了什么?

更新

好的,在 JS 中没有后视:(

但无论如何,我需要一个正则表达式来获得匹配的正确开始和结束索引。没有前导空格。

【问题讨论】:

  • Javascript 中没有lookbehind
  • 哦,谢谢! :D 我不知道 :D Erm... 知道我怎样才能达到我的目标吗? :)
  • 下次小心选择JavaScriptlike so
  • 选择左侧的 JavaScript 选项很有用,可以验证语法对 JS 是否有效,而不仅仅是 PCRE(这是默认设置)
  • 在什么情况下 RegEx 不应该匹配?

标签: regex


【解决方案1】:

确保您始终在 regex101.com 上选择正确的正则表达式引擎。查看因使用 JS-only compatible regex with [^] construct in Python 而出现的问题。

JS 正则表达式 - 在回答这个问题时 - 不支持lookbehinds。现在,它在its introduction in ECMAScript 2018 之后被越来越多地采用。您在这里并不需要它,因为您可以使用捕获组:

var re = /(?:\s|^)@(\S+)/g; 
var str = 's  @vln1\n@vln2\n';
var res = [];
while ((m = re.exec(str)) !== null) {
  res.push(m[1]);
}
console.log(res);

(?:\s|^)@(\S+) 将空格或字符串开头与 (?:\s|^) 匹配,然后与 @ 匹配,然后与 @ 匹配并捕获到第 1 组中的一个或多个非空格字符987654429@.

要获取开始/结束索引,请使用

var re = /(\s|^)@\S+/g; 
var str = 's  @vln1\n@vln2\n';
var pos = [];
while ((m = re.exec(str)) !== null) {
  pos.push([m.index+m[1].length, m.index+m[0].length]);
}
console.log(pos);

奖金

我的正则表达式在 regex101.com 工作,但不在...

【讨论】:

  • 我的主要目标是获取开始和结束索引。
  • 索引是什么? @之后的位置?
  • '@' 的索引和单词的结尾。现在,在字符串开头的情况下,我得到 0,在中间文本的情况下 - 索引 - 1(匹配空间的 coz)
  • @Kindzoku 让我们回溯一下——为什么你需要索引吗?因为我不确定正则表达式是否会有所帮助,即使它有效。
  • 好吧,我添加了另一个 sn-p 来返回 @\S+-matching 值的开始和结束位置列表。真的,不知道你为什么需要它们。
猜你喜欢
  • 2022-11-18
相关资源
最近更新 更多