【发布时间】:2012-04-28 04:14:38
【问题描述】:
大家好,这里是正则表达式新手。,
我正在尝试编写一个验证 IPv6 地址的正则表达式。我还没有添加端口部分,我想先让地址部分工作。
这是我目前所拥有的:
\\[?(?:[:0-9A-Fa-f]+)\\]?
这使得左括号和右括号是可选的。但正如您所见,它们是独立可选的。正则表达式有没有办法要求同时要求开括号和右括号,或者都不要求?
【问题讨论】:
大家好,这里是正则表达式新手。,
我正在尝试编写一个验证 IPv6 地址的正则表达式。我还没有添加端口部分,我想先让地址部分工作。
这是我目前所拥有的:
\\[?(?:[:0-9A-Fa-f]+)\\]?
这使得左括号和右括号是可选的。但正如您所见,它们是独立可选的。正则表达式有没有办法要求同时要求开括号和右括号,或者都不要求?
【问题讨论】:
我看到这是一个老问题......但你也可以在这个正则表达式中使用:^([0-9a-fA-F]+:){7}[0-9a-fA-F]+$或者这个:^[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}: [0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}:[0-9a- fA-F]{1,4}:[0-9a-fA-F]{1,4}$
【讨论】:
Regex 是一个很好的字符串模式匹配工具,但是您在这里遇到了它的一个弱点。匹配括号对可能会很棘手。
在更复杂的情况下——即尝试读取程序代码时——解决方案根本不使用正则表达式,而是使用适当的代码解析器。
即使是相当简单的情况也可能难以回答,因为所涉及的正则表达式语法可能非常复杂,而且还因为像这样的更高级的正则表达式功能,不同的实现可能使用不同的语法。 This question 可能会提供一些关于如何进行操作的提示,以及您可能使用的不同语法。
但是,在您的情况下,问题并不太复杂,并且出现了一个相当简单的解决方案:只需将整个表达式与所需的两个括号匹配,或者将整个表达式与两个括号都不匹配。换句话说,将表达式的主要部分重复两次,一次带括号,一次不带括号,并在它们之间用管道表示or:
\(\[(?:[:0-9A-Fa-f]+)\])|(?:[:0-9A-Fa-f]+)\
希望对您有所帮助。
【讨论】: