Regex golf - Is there a shorter way?
我做了这个regex来检查字符串是否是有效的IP,包括检查每个八进制数是否在0-255之间(更具体地说,它检查是否在0-199或200-249或250-255之间)。
((1?\d?\d|2[0-4]\d|25[0-5])\.){3}(1?\d?\d|2[0-4]\d|25[0-5])
更简单的方法是:
(pattern\.){3}pattern
它与pattern.pattern.pattern.pattern匹配,使得模式是一个介于0和255之间的数字。
我想知道是否有一个更短的方法来写这个regex,这样pattern只需要写一次,而不象(pattern\.?){4}那样影响regex的准确性。
编辑
看起来像这样:^pattern($|\.(?!$)){4}$完全按照我的要求做。
摘自:https://stackoverflow.com/a/28446132/4526483
- 你的正则表达式接受00,但不接受000。为什么?
- 我想我没见过有人在八进制中用多位数零写IP地址。
- 但这并不意味着它是无效的。
- 我想如果你真的在等他们,你可以用(0|1)?\d?\d代替1?\d?\d。
- IP地址验证的正则表达式可能重复
- IP地址验证是一个非常复杂的主题,几乎不可能在一个regex中覆盖。请看这个。en.wikipedia.org/wiki/ipv4网站
- 具体来说,听起来您正在寻找这个答案:stackoverflow.com/a/28445732/1255289
- 假设模式只是4,那么'^(4((?=$)|.(?!$))){4}$'与字符串的开头、字符串末尾的4或不在末尾的点匹配,四次,然后是字符串的结尾。因为我认为不可能多次匹配字符串的末尾,所以这似乎将其严格限制在4.4.4.4上。您的模式不同,您的regex引擎可能不支持查找。YMMV。
事实上是的!从一个稍微太灵活的regex开始,它有一次复杂的模式:
然后应用断言锁定点:
1
| (?=(\d+\.){3}\d+([^.\d]|$))(pattern\.?){4} |
完整的regex将是:
1
| (?=(\d+\.){3}\d+([^.\d]|$)(1?\d?\d|2[0-4]\d|25[0-5])\.){4} |
如果点可以立即跟随IP,则从look ahead中的character类中删除该点。
- 看起来确实有点短:(?=(\\d+\.){3}\\d+)((1?\d?\d|2[0-4]\d|25[0-5])\.?){4}
- @knowbody如果你对后面的内容不挑剔,你甚至可以完全删除最后一部分([^.\d]|$)。