如何将“STAR”视为常规游戏中的量词?

时间:2015-05-30 06:00:35

标签: java regular-language

以下IP模型没有问题(例如):

255.3.3.6

由此RE(来自:http://www.mkyong.com/regular-expressions/how-to-validate-ip-address-with-regular-expression/):

   "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +

    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +

    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +

    "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";

但我希望有一个IP模式来处理一个IP,如下面的模型:

255.*.3.100

OR

*.*.3.100

OR

*.*.*.*

(IP中的任何地方,可以是明星)

我使用这种模式:

         "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.|(\\*)\\." +
         "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.|(\\*)\\." +
         "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.|(\\*)\\." +
         "([01]?\\d\\d?|2[0-4]\\d|25[0-5])|(\\*)\\.$";

但它不起作用。

我认为我的模式中的明星被认为是一个量词。 我该怎么办?请帮助我。

1 个答案:

答案 0 :(得分:1)

星号是另一种选择。撰写不重复。

String group = "(?:[01]?\\d\\d?|2[0-4]\\d|25[0-5]|\\*)";
String patstr = "^" + group + "(\\." + group + "){3}$";
Pattern pat = Pattern.compile( patstr );
Matcher mat = pat.matcher( args[0] );
System.out.println( mat.matches() );

OP的正则表达式表示的语法可以写成

IP ::= DP
      |APDP
      |APDP
      |APD
      |AP
D ::= Number
P ::= '.'
A ::= '*'

请注意,运营商|会分隔替代方案;因此没有有效的地址匹配,也没有数字被星号代替的地址。