关于正则表达高尔夫:正则表达式高尔夫 – 有更短的方式吗?

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


事实上是的!从一个稍微太灵活的regex开始,它有一次复杂的模式:

1
(pattern\.?){4}

然后应用断言锁定点:

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类中删除该点。