黑马程序员技术交流社区
标题:
正则表达式,大家帮帮忙,自己研究不透,求加注释,谢谢。
[打印本页]
作者:
墓____夜
时间:
2014-5-26 22:27
标题:
正则表达式,大家帮帮忙,自己研究不透,求加注释,谢谢。
写一个正则表达式,可以匹配尾号5连的手机号。规则: 第1位是1,第二位可以是数字3458其中之一,后面4位任意数字,最后5位为任意相同的数字。
例如:18601088888、13912366666
作者:
lvc
时间:
2014-5-27 01:40
这不是测试题吗???
package com.itheima;
public class Test5 {
public static void main(String args[])
{
//获取输入值
String mobile="13912366766";
//把字符串转换成字符数组
char[] array=mobile.toCharArray();
//数字或者字母判断开关
boolean excheng=true;
//判断输入的是否全为数字
for(int i=0;i<=array.length-1;i++)
{
switch(array[i])
{
case '0':
break;
case '1':
break;
case '2':
break;
case '3':
break;
case '4':
break;
case '5':
break;
case '6':
break;
case '7':
break;
case '8':
break;
case '9':
break;
default:
System.out.println("请输入数字");
excheng=false;
}
}
//判断是否有11位
if(mobile.length()==11&&excheng==true)
{
//判断第一位是否为1
if(array[0]=='1')
{
//取出第二位值,并判断是否为3458中的其中一个
int secondly=array[1];
switch(secondly)
{
case '3':
//判断后五位是否相等
Five(array);
break;
case '4':
Five(array);
break;
case '5':
Five(array);
break;
case '8':
Five(array);
break;
default:
System.out.print("输入有误3");
}
}else
{
System.out.println("输人错误2");
}
}else
{
System.out.println("输人错误1");
}
}
public static void Five(char[] array)
{
//判断开关
boolean excheng=true;
//取出后五位进行比较
for(int i=array.length-1;i>=array.length-5;i--)
{
if(array[array.length-1]!=array[i])
{
System.out.println("这不是尾号5连的手机");
excheng=false;
//continue;//结束当次循环
//结束循环
break;
}
}
//当excheng==true时自行
if(excheng)
{
System.out.println("这是尾号5连的手机");
}
}
}
复制代码
作者:
卢宝辉
时间:
2014-5-27 14:09
本帖最后由 卢宝辉 于 2014-5-27 14:21 编辑
System.out.println("18601088888".matches("1[3458]\\d{1,4}(0{5}|1{5}|2{5}|3{5}|4{5}|5{5}|6{5}|7{5}|8{5}|9{5})"));
System.out.println("18601088888".matches("1[3458]\\d{1,4}(\\d)\\1{4}"));
能想到的就这两个,有更简单的可以交流一下!
作者:
AntThinking_toT
时间:
2014-5-27 16:56
不知道LZ是正则表达式不会写(应该是这里)还是不会用java解析正则表达式?下面我们依次解决上面的两个问题:
1.正则表达式也是一个字符串,这个题的正则表达式应该是:"1[3458]\\d{4}(\\d)\\1{4}"。以1开头,所以第一个字符为1;第2位为3458中的任意一个,在正则表达式中有一类字符称为“多种字符”,它又包括一个子类叫做自定义多种字符,[3458]就是一个自定义多种字符(还有其它类型,LZ可以自己查资料),它的意思是此处可以为3、4、5、8中的任意一个;后四个为任意数字,这里就用到了上面所讲的多种字符的另一个子类,系统定义多种字符,其中\d表示任意一个数字(0-9),后{4}表示把\d重复4遍,当然你也可以不写{4}而直接写4遍\d,至于\d前还有一个\是因为如果不写,会使用java认为是转义字符,报错;后五位为任意的相同的数字,此处的实现方法,就是先确定一个,也就是(\d),\1的意思把前面字符串出现第一个括号内容重复一次,后面加{4}说明把\1重复4次,与前面一样,这样就可以完成后5位相同的匹配了。
2.Java利用正则表达式进行匹配拥有多种方法,最常用的一种就是通过Pattern,Matcher匹配,具体看代码:
Pattern p = Pattern.compile(regEx);//调用Pattern静态方法对正则表达式进行编译,得到对象
Matcher m = p.matcher(phoneNumber);//调用matcher方法,获取Matcher匹配对象
boolean b = m.matches();//调用matches方法验证是否匹配
复制代码
我做此题的完整代码如下:
package com.itheima;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 第5题:写一个正则表达式,可以匹配尾号5连的手机号。 规则: 第1位是1,第二位可以是数字3458其中之一,后面4位任意数字,最后5位为任意相同的数字。例如:18601088888、13912366666
*
* 解 析:此题关键点在于两点:一是最关键的正则表达式构建;二是正则表达式的解析,很显然要封装成函数,返回值为boolean类型。
*
* 扩 展:与用户交互,需要用户输入手机号然后匹配,直到用户输入ok。
*
* @author Tad http://weibo.com/weinabanta
*/
public class Test5 {
public static void main(String[] args) throws IOException {
//构造5号正则表达式
String numRegEx = "1[3458]\\d{4}(\\d)\\1{4}";
//获取用户输入手机号
String phoneNumber = getPhoneNumber();
//直到用户输入ok结果
while (!phoneNumber.equals("ok")) {
//根据正则表达式匹配手机号
boolean result = isMatched(numRegEx, phoneNumber);
//根据匹配结果输出相关信息
printResult(result);
//再次获取手机号
phoneNumber = getPhoneNumber();
}
System.out.println("程序结束!");
}
/**
* @param numRegEx 正则表达式表示的特定手机号格式
* @param phoneNumber 需要匹配的手机号
* @return 匹配结果
*/
private static boolean isMatched(String numRegEx, String phoneNumber) {
Pattern p = Pattern.compile(numRegEx);
Matcher m = p.matcher(phoneNumber);
return m.matches();
}
/**
* @return 返回用户输入的字符串
* @throws IOException
*/
private static String getPhoneNumber() throws IOException{
System.out.print("输入匹配手机号:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
return br.readLine();
}
/**
* @param result 匹配结果
*/
private static void printResult(boolean result) {
if (result == true) {
System.out.println("匹配5连号正确");
} else {
System.out.println("匹配5连号错误");
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2