我需要一个正则表达式,对于2000以上的输入为True:
for (int i = 1998; i < 10001; i++)
{
String s = Integer.toString(i);
// Above Range 2000 to 9999
System.out.print(i+"\t");
System.out.println(s.matches("[^1]?[0-9]{1,3}"));
}
答案 0 :(得分:0)
答案 1 :(得分:0)
如果要从字符串中仅提取大于2000的整数,可以采用两种方法。
值得注意的是,在正则表达式模式中考虑数学因素总是很简单,因为正则表达式模式是在字符逻辑中构建的。因此,您可以使用[0-9]+
或[1-9][0-9]*
简单地提取所有整数,将结果转换为整数,并使用if语句测试每个整数。
您可以直接使用模式进行操作,但是您需要小心地限制对性能的影响,避免巨大的交替和失败的分支。这是你可以这样做的方式:
[3-9][0-9]{3,}
|
2
(?:
[1-9][0-9]{2,}
|
0
(?:
[1-9][0-9]+
|
0 (?: [1-9][0-9]* | 0 [0-9]+)
)
)
|
1 [0-9]{4,}
注意:要允许2000
,请删除所有第二个主要备选方案并将第一个更改为[2-9][0-9]{3,}
这种模式的主要兴趣在于,一旦正则表达式引擎进入分支,它始终处于良好状态,并且没有其他分支来测试结果(成功或失败)。请注意,三个主要分支按概率顺序排序,再一次限制引擎工作。
如果将所有内容都包含在非捕获组中,并且如果当前测试的字符是数字,则使用前瞻检查之前,可以对其进行更多(必须进行测试)。这种改进允许快速跳过不是数字的字符串的所有字符而不测试主要交替的三个分支。
(?=[1-9])(?:pattern)
给出:
(?=[1-9])(?:[3-9][0-9]{3,}|2(?:[1-9][0-9]{2,}|0(?:[1-9][0-9]+|0(?:[1-9][0-9]*|0[0-9]+)))|1[0-9]{4,})