regex 正则表达式无效:单独的量词括号

zzwlnbp8  于 2023-01-27  发布在  其他
关注(0)|答案(4)|浏览(154)

我有一个html电话模式,将接受这些格式:

+61 x xxxx xxxx,
+61xxxxxxxxx,
0x xxxx xxxx,
0xxxxxxxxx,
xxxx xxxx,
xxxxxxxx,
+xx xxx xxx xxx,
+xxxxxxxxxxx,
0xxx xxx xxx,
0xxxxxxxxx

几个月前它还能正常工作,现在突然我的电话字段无法验证。

Pattern attribute value ^(?:0|\(?\+61\)?\s?|0061\s?)[1-79](?:[\.\-\s]?\d\d){4}|(\d{4}[\s]\d{4})|(\d{8})|(\d{4}[\s]\d{3}[\s]\d{3})|(\+61\[\s]\d{3}[\s]\d{3}[\s]\d{3})|(\+61\s\d{3}\s\d{3}\s\d{3})$ is not a valid regular expression: Uncaught SyntaxError: Invalid regular expression: /^(?:0|\(?\+61\)?\s?|0061\s?)[1-79](?:[\.\-\s]?\d\d){4}|(\d{4}[\s]\d{4})|(\d{8})|(\d{4}[\s]\d{3}[\s]\d{3})|(\+61\[\s]\d{3}[\s]\d{3}[\s]\d{3})|(\+61\s\d{3}\s\d{3}\s\d{3})$/: Lone quantifier brackets
fjaof16o

fjaof16o1#

到目前为止,还没有人愿意指出错误在您的模式中的什么地方。

…|(\+61\[\s]\d{3}[\s]\d{3}[\s]\d{3})|(\+61\s\d{3}\s\d{3}\s\d{3})$
       ^

您错误地插入了一个反斜杠,转义了左括号,因此将其变为普通字符,并保留了右括号Lone(遗憾的是,错误消息有些误导,因为这些括号当然不是quantifier brackets)。

xmq68pz9

xmq68pz92#

与上面的请求类似,我在Visual Studio代码中使用以下RegEx捕获括号中的单词时收到了错误:
\[([^\\[\r\n]*(?:\\.[^\\]\r\n]*)*)\](不正确)
在文本字符串上(SQL)

SELECT d.[fname]
,d.[lname],d.[address1],d.[address2],d.[City],d.[zip]
FROM my_table d
WHERE [hh_id] IN (SELECT [HhId]
FROM other_table)

但是,在https://regex101.com/r/HGycR9/1中显示的在线正则表达式工具中使用此RegEx模式表明它是有效的RegEx。
正确的RegEx模式是\[([^[\r\n]*(?:\\.[^\r\n]*)*)\],它将突出显示:
SELECT d.***[名字]***,d.***[人名]***,d.***[地址1]***,d.***[地址2]***,d.***[城市]***,d.***[邮政编码]从我的表d中选择其中[小时标识]IN(SELECT[HhId]***从其他表)
然后,您可以在VS代码的replace字段中使用$1来删除方括号,并保留其中包含的单词。

SELECT d.fname
,d.lname,d.address1,d.address2,d.City,d.zip
FROM my_table d
WHERE hh_id IN (SELECT HhId
FROM other_table)
k5hmc34c

k5hmc34c3#

为了更明确地说明这一点,VSCode(显然还有Visual Studio)与其他Java/ECMAScript正则表达式解释器之间的区别在于,VS产品对匹配括号很挑剔,即使它们应该被解释为文字字符。
例如,下面的正则表达式在大多数基于JS(和PCRE)的正则表达式解释器中完全可以匹配方括号中的字符串:[string].

\[\w+]
^

虽然只有"左"方括号被转义,"右"方括号也被解释为一个文本字符。从语义上讲,第一个括号转义后,实际上还没有开始字符类匹配(或者分组或量词,如果匹配的是圆括号()或大括号{})。
在VSCode中,您 * 必须 * 也转义"右"括号,否则您会得到"单独的量词括号"错误。

\[\w+\]
^    ^

另一个令人恼火的方面是. NET正则表达式解释器的行为与标准的Javascript解释器非常相似,所以如果开始的括号被转义,它同样不关心转义两个括号。这种性质的东西在. NET或Powershell中很好,但在VSCode中却不一样。

e0uiprwp

e0uiprwp4#

就是说模式无效。
如果您想匹配来自澳大利亚的手机,您可以用途:

pattern="^(?:0|\(?\+61\)?\s?|0061\s?)[1-79](?:[\.\-\s]?\d\d){4}$"

找到模式here
示例:https://jsfiddle.net

相关问题