正则表达式适用于 regex101.com,但不适用于 prod

Posted

技术标签:

【中文标题】正则表达式适用于 regex101.com,但不适用于 prod【英文标题】:Regular expression works on regex101.com, but not on prod 【发布时间】:2020-12-03 19:01:55 【问题描述】:

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 不应该匹配? 【参考方案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 工作,但不在...

首先,您是否检查了左侧工具窗格中的代码生成器链接?

All languages - "Literal string" vs. "String literal" alert - 确保在正则表达式测试器中测试代码中使用的相同文本,文字字符串。一种常见的情况是将string literal 值直接复制/粘贴到测试字符串字段中,并使用所有字符串转义序列,例如\n(换行符)、\r(回车)、\t(制表符)。例如,请参阅Regex_search c++。请注意,必须将它们替换为字面上的对应物。因此,如果您在 Python 中有text = "Text\n\n abc",则必须在正则表达式测试器文本字段中使用Text、两个换行符、abcText.*?abc will never match it 虽然你是 might think it "works"。是的,. 并不总是匹配换行符,请参阅How do I match any character across multiple lines in a regular expression?

All languages - Backslash alert - 确保在字符串文字中正确使用反斜杠,在大多数语言中,在常规字符串文字中,使用双反斜杠,即 regex101.com 中使用的 \d 必须写为 \\d。在 原始字符串文字 中,使用单个反斜杠,与 regex101 相同。转义 单词边界 非常重要,因为在许多语言中(C#、Python、Java、JavaScript、Ruby 等),"\b" 用于定义一个 BACKSPACE 字符,即它是一个有效的字符串转义序列php 不支持\b 字符串转义序列,所以"/\b/" = '/\b/' 那里。

All languages - Default flags - Global and Multiline - 请注意,在 regex101.com 上默认启用 mg 标志。因此,如果您使用^$,它们将相应地匹配行首和行尾。如果您在代码中需要相同的行为,请检查如何实现多行模式并使用特定标志,或者 - 如果支持 - 使用内联 (?m) 嵌入式(内联)修饰符。 g 标志启用多次匹配,它通常使用特定的函数/方法来实现。检查您的语言参考以找到合适的参考。

line-breaks - regex101.com 上的 行结尾 仅是 LF,您不能测试带有 CRLF 结尾的字符串,请参阅 regex101.com VS myserver - different results。每个正则表达式库的解决方案可能不同:使用\R(PCRE、Java、Ruby)或某种\v(Boost、PCRE)、\r?\n(?:\r\n?|\n)/(?&gt;\r\n?|\n)(适用于.NET ) 或其他库中的[\r\n]+(请参阅C#、PHP 的答案)。 另一个与您针对多行字符串(不是独立字符串/行的列表)测试正则表达式这一事实相关的问题是,您的模式可能会使用行尾 \n,带有否定字符类的字符,请参阅an issue like that。 \D 匹配行尾字符,为了避免这种情况,可以使用 [^\d\n] 或其他替代方法。

php - 您正在处理 Unicode 字符串,或者希望速记字符类也匹配 Unicode 字符(例如,\w+ 匹配 СтрибижевStribiżew,或 \s+ 匹配困难空格),那么您需要使用u modifier,请参阅preg_match() returns 0 although regex testers work - 要匹配所有匹配项,请使用preg_match_all,而不是preg_match/...pattern.../g,请参阅PHP preg_match to find multiple occurrences 和"Unknown modifier 'g' in..." when using preg_match in PHP? - 您的带有内联反向引用的正则表达式(如\1)拒绝工作?您是否使用双引号字符串文字?使用单引号,见Backreference does not work in PHP

phplaravel - 请注意,您需要在模式周围使用正则表达式分隔符,请参阅 https://***.com/questions/22430529

python - 您使用的 re.match 仅在字符串开头搜索匹配项,请使用 re.search:Regex works fine on Pythex, but not in Python - 如果正则表达式包含捕获组, re.findall 返回捕获/捕获元组的列表。使用非捕获组,或re.finditer,或删除冗余捕获组,请参阅re.findall behaves weird - 如果您在模式中使用^ 来表示行的开始,而不是整个字符串的开始,或者使用$ 来表示一行的结尾而不是字符串,将re.Mre.MULTILINE 标志传递给re 方法,请参阅Using ^ to match beginning of line in Python regex - 如果您尝试跨多行匹配某些文本,并使用re.DOTALLre.S[\s\S]* / [\s\S]*?,仍然没有任何效果,请检查您是否逐行读取文件,例如使用for line in file:。您必须将整个文件内容作为输入传递给正则表达式方法,请参阅Getting Everything Between Two Characters Across New Lines。 - 无法向正则表达式添加标志并尝试pattern = r"/abc/gi" 之类的东西?见How to add modifers to regex in python?

c#、.net - .NET 正则表达式不支持 占有量词,例如 ++*+??1,10?,参见 .NET regex matching digits between optional text with possessive quantifer is not working - 当您匹配多行字符串并使用RegexOptions.Multiline 选项(或内联(?m) 修饰符)和模式中的$ 锚点来匹配整行,并且没有匹配在代码中,您需要在$ 之前添加\r?,参见.Net regex matching $ with the end of the string and not of line, even with multiline enabled - 要获得多个匹配项,请使用Regex.Matches,而不是Regex.Match,参见RegEx Match multiple times in string - 与上面类似的情况:通过双换行符序列将字符串分成段落 - C# / Regex Pattern works in online testing, but not at runtime - 您应该删除正则表达式分隔符,即@"/\d+/" 必须实际上看起来像@"\d+",请参阅Simple and tested online regex containing regex delimiters does not work in C# code - 如果您不必要地使用Regex.Escape 转义正则表达式中的所有字符(如Regex.Escape(@"\d+\.\d+")),则需要删除Regex.Escape,请参阅Regular Expression working in regex tester, but not in c#

dartflutter - 使用原始字符串文字、RegExp(r"\d") 或双反斜杠 (RegExp("\\d")) - https://***.com/questions/59085824

javascript - RegExp("\\d") 中的双转义反斜杠:Why do regex constructors need to be double escaped? - 大多数浏览器不支持(负面)lookbehinds:Regex works on browser but not in Node.js - 字符串是不可变的,将 .replace 结果分配给 var - The .replace() method does change the string in place - 检索所有匹配 str.match(/pat/g) - Regex101 and Js regex search showing different results 或 RegExp#exec, RegEx to extract all matches from string using RegExp.exec- 替换字符串中的 all 模式匹配:Why does javascript replace only first instance when using replace?

javascriptangular - 如果您使用字符串文字定义正则表达式,或者只使用正则表达式文字符号,请加倍反斜杠,请参阅 https://***.com/questions/56097782

java - 字边界不起作用?确保使用双反斜杠 "\\b",请参阅 Regex \b word boundary not works - 获取 invalid escape sequence 异常?同样的事情,双反斜杠 - Java doesn't work with regex \s, says: invalid escape sequence - No match found 打扰你了?运行 Matcher.find() / Matcher.matches() - Why does my regex work on RegexPlanet and regex101 but not in my code? - .matches() 需要完整的字符串匹配,使用 .find(): Java Regex pattern that matches in any online tester but doesn't in Eclipse - 使用 matcher.group(x) 访问组:Regex not working in Java while working otherwise - 在字符类中,[] 都必须转义 - Using square brackets inside character class in Java regex - 你不应该连续运行 matcher.matches()matcher.find(),只使用 if (matcher.matches()) ... 来检查模式是否匹配整个字符串,然后采取相应的行动,或使用if (matcher.find()) 检查是否存在单个匹配项或使用while (matcher.find()) 查找多个匹配项(或Matcher#results())。见Why does my regex work on RegexPlanet and regex101 but not in my code?

scala - 您的正则表达式尝试匹配多行,但您逐行读取文件(例如,使用 for (line &lt;- fSource.getLines))?将其读入单个变量(参见matching new line in Scala regex, when reading from file)

kotlin - 你有Regex("/^\\d+$/")?删除外部斜线,它们是regex delimiter chars,它们不是模式的一部分。请参阅Find one or more word in string using Regex in Kotlin - 您期望部分字符串匹配,但 .matchEntire 需要完整字符串匹配?使用.find,见Regex doesn't match in Kotlin

mongodb - 不要用单/双引号将/.../ 括起来,请参阅mongodb regex doesn't work

c++ - regex_match 需要完整的字符串匹配,使用 regex_search 查找部分匹配 - Regex not working as expected with C++ regex_match - regex_search 仅查找第一个匹配项。使用sregex_token_iteratorsregex_iterator 获取所有匹配项:请参阅What does std::match_results::size return? - 当您使用std::string input; std::cin &gt;&gt; input; 读取用户定义的字符串时,请注意cin 只会到达第一个空格,以读取整行正确,使用 std::getline(std::cin, input); - C++ Regex to match '+' quantifier - "\d" 不起作用,您需要使用 "\\d"R"(\d)"原始字符串文字) - @987654394 @ - 确保正则表达式针对文字文本而不是字符串文字进行测试,请参阅Regex_search c++

go - 双反斜杠或使用原始字符串文字:Regular expression doesn't work in Go - Go 正则表达式不支持环视,在测试前在 regex101.com 上选择正确的选项 (Go)! Regex expression negated set not working golang

groovy - 返回所有匹配项:Regex that works on regex101 does not work in Groovy

r - 字符串文字中的双转义反斜杠:"'\w' is an unrecognized escape" in grep - 将 perl=TRUE 用于 PCRE 引擎 ((g)sub/(g)regexpr):Why is this regex using lookbehinds invalid in R?

oracle - 所有量词的贪心度由正则表达式中的第一个量词设置,请参阅Regex101 vs Oracle Regex(然后,您需要使所有量词与第一个量词一样贪婪)] - \b 不起作用? Oracle 正则表达式根本不支持字边界,请使用Regex matching works on regex tester but not in oracle中所示的变通方法

firebase - 双转义反斜杠,确保^ 只出现在模式的开头,$ 只出现在模式的末尾(如果有的话),注意你不能使用超过 9内联反向引用:Firebase Rules Regex Birthday

firebasegoogle-cloud-firestore - 在 Firestore 安全规则中,正则表达式需要作为字符串传递,这也意味着它不应包含在 / 符号中,即使用 allow create: if docId.matches("^\\d+$")。 ...见 https://***.com/questions/63243300

google-data-studio - REGEXP_REPLACE 中的 /pattern/g 必须不包含 / 正则表达式分隔符和标志(如 g) - 请参阅 How to use Regex to replace square brackets from date field in Google Data Studio?

google-sheets - 如果您认为 REGEXEXTRACT 不返回完整匹配,截断结果,您应该检查您的正则表达式中是否有多余的捕获组并将它们删除,或者将捕获组转换为非通过在打开(后添加?:捕获,见Extract url domain root in Google Sheet

sed - Why does my regular expression work in X but not in Y?

word-boundarypcrephp - [[:&lt;:]][[:&gt;:]] 在正则表达式测试器中不起作用,尽管它们是 PCRE 中的有效构造,请参阅 https://***.com/questions/ 48670105

snowflake-cloud-data-platform snowflake-sql - 如果你正在编写存储过程,而\\d 不起作用,则需要再次将它们加倍并使用\\\\d,请参阅REGEX conversion of VARCHAR value to DATE in Snowflake stored procedure using RLIKE not consistent。

【讨论】:

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

以上是关于正则表达式适用于 regex101.com,但不适用于 prod的主要内容,如果未能解决你的问题,请参考以下文章

我的正则表达式适用于 regex101 但不适用于 python? [复制]

RegEx 替换适用于 Ruby gsub,但不适用于 sed

Python3 正则表达式不适用于脚本,但适用于 pythex.org

正则表达式验证不适用于 Google Chrome Android 应用程序,但适用于 Chrome 浏览器 - PC

BigQuery 正则表达式提取

RegEx 不适用于 .NET,但适用于其他 RegEx 实现