正则表达式适用于 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... 知道我怎样才能达到我的目标吗? :) 下次小心选择JavaScript
like 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
、两个换行符、abc
。 Text.*?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 上默认启用 m
和 g
标志。因此,如果您使用^
和$
,它们将相应地匹配行首和行尾。如果您在代码中需要相同的行为,请检查如何实现多行模式并使用特定标志,或者 - 如果支持 - 使用内联 (?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)
/(?>\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.M
或re.MULTILINE
标志传递给re
方法,请参阅Using ^ to match beginning of line in Python regex
- 如果您尝试跨多行匹配某些文本,并使用re.DOTALL
或re.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 <- 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_iterator
或sregex_iterator
获取所有匹配项:请参阅What does std::match_results::size return? - 当您使用std::string input; std::cin >> 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 - [[:<:]]
和 [[:>:]]
在正则表达式测试器中不起作用,尽管它们是 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