java中tollfree数的正则表达式
我用这个正则表达式测试电话,应该是免费的java中tollfree数的正则表达式,java,regex,Java,Regex,我用这个正则表达式测试电话,应该是免费的 public static final Pattern patternTollFree = Pattern.compile("^((877)|(800)|(866)|(888))"); 因此,我只想得到那些#用户可能在字符串前面遗漏了1的地方,但我尝试了几种方法,但我无法让java与之匹配 public String changeRingTo( String changedRinger ) { if ( null == changedRinge
public static final Pattern patternTollFree = Pattern.compile("^((877)|(800)|(866)|(888))");
因此,我只想得到那些#用户可能在字符串前面遗漏了1的地方,但我尝试了几种方法,但我无法让java与之匹配
public String changeRingTo( String changedRinger )
{
if ( null == changedRinger || changedRinger.length() != 10)
return changedRinger;
if ( patternTollFree.matcher(changedRinger).region(0, 2).matches() )
changedRinger = '1' + changedRinger;
return changedRinger;
}
我无法使下面的第二个测试用例成功。我做错了什么
assertEquals( "Regex not working", "8189091000", of.changeRingTo("8189091000"));
assertEquals( "Regex not working", "18769091000", of.changeRingTo("8769091000"));
region
的第二个参数是独占的,不是包含的。现在,您只允许它检查输入的前两个字符。你需要把它改成
if(patternTollFree.matcher(changedRinger).region(0,3.matches())
看
请注意,在正则表达式中使用
^
并在匹配器上指定区域是多余的。第二个测试用例失败,因为它以无效的免费前缀876
开头。此外,如另一个答案所示,您应该将区域(0,2)
更改为区域(0,3)
,尽管整个行可以大大简化。请注意,这是特定于国家的。这很好,因为这仅适用于美国东南部。但请注意,电话号码可以采用多种不同的格式(如+1(877)1234567或001877123或空格等),格式仅适用于上面指定的格式。没有空格、破折号等。当代码到达我正在测试的区域时,它已被删除。谢谢,我不敢相信我错过了。这就是问题的症结所在。怎么能简化呢?8((66)|(77))@Arnite:将其更改为if(changedRinger.matches(^(877 | 800 | 866 | 888)\\d+$)
并完全删除patternTollFree
变量。如果您预编译了模式,它应该具有更好的性能。@Arnite:这种微观性能差异在您的应用程序中是否显著?如果不是,我会选择可读性而不是性能。