我的java之路——按照电话机表盘数字与字符的对应关系(这里用数字1而不是0代表空格),用数字串匹配字符串

/*
 * 需求:按照电话机表盘数字与字符的对应关系(这里用数字1而不是0代表空格),用数字串匹配字符串
 * 思路:获得用户输入,判断是不是纯数字串,如果是这拼接正则表达式,和各个字符串匹配
 * */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class NumbersMatchString
{
	public static void main(String argu[]) throws IOException
	{
		String str[] = {"watch","match","noise","risky","stock","work","back",
				"come","deal","desk","book","java","tool","face"};//测试字符串数组
		NumbersMatchString nms = new NumbersMatchString();
		String numStr = nms.getInput();			//得到用户的合法输入
		String regex = nms.getRegex(numStr);	//通过用户输入获得正则表达式
		Pattern p = Pattern.compile(regex);		//获得正则对象
		int count = 0;
		for(String st:str)
		{
			Matcher m = p.matcher(st);			//获得匹配器
			if(m.lookingAt())					//判断字符串中有没有符合正则的子串(从第〇位开始匹配,匹配不到则返回false)
			{
				++count;						//统计匹配到的字符串数
				System.out.println(st);			//如果匹配则输出
			}
		}
		System.out.println("共匹配到" + count + "个字符串!");
	}
	/**
	 * @return:返回用户输入的合法字符串
	 * @throws IOException:方便起见,没有处理异常
	 */
	public String getInput() throws IOException
	{
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		System.out.println("请输入[1-9]组成的数字串:");
		String str = bf.readLine();
		Pattern p = Pattern.compile("[0\\D]");//判断是不是包含非数字和0
		Matcher m = p.matcher(str);
		while(str.length()<=0||m.matches())//字符串长度<=0或者包含非数字和0时需要重新输入
		{
			System.out.println("输入必须是由数字[1-9]组成的数字串,请重新输入:");
			str = bf.readLine();
			m = p.matcher(str);
		}
		return str;
	}
	/**
	 * @param str:根据str来生成正则表达式
	 * @return:返回生成的正则表达式
	 */
	public String getRegex(String str)
	{
		String regex = "";
		int i = 0;
		for(;i<str.length();++i)
		{
			switch(str.charAt(i))
			{
				case '1':regex += " ";break;	
				case '2':regex += "[a-c]";break;
				case '3':regex += "[d-f]";break;
				case '4':regex += "[g-i]";break;
				case '5':regex += "[j-l]";break;
				case '6':regex += "[m-o]";break;
				case '7':regex += "[p-s]";break;
				case '8':regex += "[t-v]";break;
				case '9':regex += "[w-z]";break;
				default:;
			}
		}
		return regex;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值