0

所以基本上我想检测是否在这些字符串中:

你好 123 我的 222 亲爱的 112 巨魔 12 8889

192.1.1.254:10000

数字的格式如下:[0 到 255][ANYTHING][0 到 255][ANYTHING][0 到 255][ANYTHING][0 到 255][ANYTHING][0 到 65536]

有谁知道我如何构建这样的正则表达式?

它用于检测是否有人以不寻常的格式发布 IP:Port 以绕过默认的 ip:port 过滤器。

编辑:至于第一条评论:我不知道正则表达式,我尝试过的是:

if(regex_match("192.168 najlepszy serwer SAMP!!1 1 join1!! 8080","/^[0-2](*)?[0-5](*)?[0-5](*).(*)[0-2](*)?[0-5](*)?[0-5](*).(*)[0-2](*)?[0-5](*)?[0-5](*).(*)[0-2](*)?[0-5](*)?[0-5](*)?$/"))
{
    print("Cannot send message");
}
else
{
    print("New message for everyone! :)");
}

和其他一些不工作的正则表达式。

4

5 回答 5

1

如果您不想检查确切范围使您的生活复杂化,那么简单的正则表达式将是:

/^.*(\d)+.+(\d)+.+(\d)+.+(\d)+.+(\d)+.*$/

前四个(\d)+部分可以替换为更复杂的 0-255 范围检查:

(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)

最后一个(\d)+替换为下一个端口范围检查:

(6553[0-5]|655[0-2]\d|65[0-4]\d\d|6[0-4]\d\d\d|[1-5]\d\d\d\d|[1-9]\d{0,3})
于 2012-07-22T17:08:11.603 回答
1

在一般情况下,不可能将您的模式准确、简单和直接地表示为正则表达式。原因是数字范围。像“在这个地方任何具有从 a 到 b 的值的整数”之类的东西太复杂了。正则表达式由有限状态机执行,这些(理论上的)野兽(基本上)只能逐个字符地查看字符串。因此,您可以匹配“忽略所有字符,直到找到第一个数字,然后检查第一个数字后面是否最多再有两个数字”之类的内容。

作为一种解决方法,您可以尝试构建一个覆盖您所需值范围的可能数字模式的交替列表(在极端情况下,列出每个值,如\b(?:1|2|3|4|...|154|155|...|255)\b)。我有一个范围为 0-255 的模式,但我没有可能的端口号范围。所以第一个近似值可能是(实际上,这只是一个近似值,没有经过彻底测试):

\b(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b.*\b(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b.*\b(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b.*\b(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b[^0-9]*[0-9]{1,5}

在上面的模式(?: .... )中意味着一个害羞的群体(不记得反向引用)并且\b意味着单词边界。

于 2012-07-22T17:26:06.983 回答
0

你确定你需要正则表达式吗?在我看来,你不需要正则表达式。只需将数字分成由非数字字符分隔的组。然后分析。

什么语言?

至于实际寻找有效范围,看看这个; http://www.regular-expressions.info/numericranges.html

于 2012-07-22T17:04:48.453 回答
0

我会做这个简单的正则表达式

((\d|\D)+)*
于 2012-07-22T17:10:40.230 回答
0

我建议您阅读正则表达式语法。对于初学者来说.是特殊的并且匹配任何字符。做类似的事情[0-2][0-5][0-5]也不会捕捉到类似的事情,192因为 9 不在 0-5 范围内。

根据您的要求,这是一个应该大致做您想要的正则表达式

([0-2]?\d{1,2}).*([0-2]?\d{1,2}).*([0-2]?\d{1,2}).*([0-2]?\d{1,2}).*(\d{1,5})?

每个([0-2]?\d{1,2})部分将匹配 1 或 2 个数字,前面可选 0、1 或 2。每个部分()将捕获一个组,然后您可以使用 Regex 引擎对其进行检查。您将需要检查该组,因为每个部分的正则表达式将匹配 255 以上的数字(特别是 256-299)。

最后一组(\d{1,5})?是捕获端口号,您必须再次检查它,因为它将捕获任何 1 到 5 位数字(因此是{1,5})。使该?组可选,如果您希望它必须与端口号匹配,请将其删除。

至于在 C 中做 Regex,我没有太多经验,但应该有一种方法来获取所有分组匹配并检查它们。不幸的是,它们将是字符串,因此您必须将它们转换为整数才能检查它们。

于 2012-07-22T17:44:52.393 回答