首页 > 代码库 > 正则表达式

正则表达式

Pattern是要符合的模式

Matcher是用这种模式去匹配字符串产生的结果

String类本身就有matches这个方法,表示这个字符串是不是匹配这种模式(模式也是一个传入的String)


一些基本是

\d  表示一个数字  example       "a4dfds323".replaceAll("\\d","-")   前面那个‘\‘是转义字符

. 任何一个字符,并不包含行结束符

\D  不是数字的一个字符

\s  空白字符  包含[\t\n\f\r]

\S 不是空白字符

\w  a word char [a-zA-Z_0-9]

\W  a non-word char


X?X,一次或一次也没有
X*X,零次或多次
X+X,一次或多次
X{n}X,恰好 n
X{n,}X,至少 n
X{n,m}X,至少 n 次,但是不超过 m

对于Email的匹配:

  public static final Pattern EMAIL_ADDRESS
      = Pattern.compile(
          "[a-zA-Z0-9\\+\\.\\_\\%\\-]{1,256}" +  //这个含义是至少有一个[a-zA-Z0-9]  然后可以有. _ % -
          "\\@" +                                //中间@
          "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}" +     //    
          "(" +
              "\\." +
              "[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25}" +
          ")+"
      );

关于PhoneNumber的匹配:

 public static final Pattern PHONE
      = Pattern.compile(                                  // sdd = space, dot, or dash
              "(\\+[0-9]+[\\- \\.]*)?"                    // +<digits><sdd>*
              + "(\\([0-9]+\\)[\\- \\.]*)?"               // (<digits>)<sdd>*    p("()".matches("\\(\\)"))为true,括弧前必须加\              + "([0-9][0-9\\- \\.][0-9\\- \\.]+[0-9])"); // <digit><digit|sdd>+<digit> 


如果匹配一个空白行

public static void main(String[] args) {
		p(" \n".matches("^[\\s&&[^\\n]]+\\n$"));  //^代表开头 ,$表示结尾  true
	}
	
	public static void p(Object s) {
		System.out.println(s);
	}


分组:

Pattern p = Pattern.compile("\\d{3,5}[a-z]{2}");
		String s = "123aa-23434bb-234cc-00";
		Matcher m = p.matcher(s);
		while(m.find()){
			p(m.group());
		}
会打印出结果
123aa
23434bb
234cc

如果我们只想要数字 我们必须把pattern改成:

Pattern p = Pattern.compile("(\\d{3,5})([a-z]{2})");
		String s = "123aa-23434bb-234cc-00";
		Matcher m = p.matcher(s);
		while(m.find()){
			p(m.group(1));
		}
结果:
123
23434
234

第一个左小括号是第一组,第二个小左括号是第二组


写一个比较简单的email的匹配:

p("sdfsdfsdfsdfsdf@163.com".matches("[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+"));  true \\w为单词字符  


关于Find:

	Pattern p = Pattern.compile("\\d{3,5}");
		String s = "123-34343-3434-00";
		
		Matcher m = p.matcher(s);  
//		p(m.matches());  //false  matches会跟find会冲突
//		m.reset();
		
		p(m.find());  //true 123
		//想知道起始位置和结束位置
		p(m.start()+"-"+m.end());  //0-3
		
		p(m.find());   //true 34343
		p(m.start()+"-"+m.end());  //4-9
		
		p(m.find());   //true 3434
		p(m.start()+"-"+m.end()); 
		
		p(m.find());  //false 00
	//	p(m.start()+"-"+m.end());  //输出这个会报错
		
		p(m.lookingAt());  //每一次找从开始的位置找,true
		p(m.lookingAt());  //每一次找从开始的位置找,true

关于替换:

Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
		StringBuffer buf = new StringBuffer();
		Matcher m = p.matcher("sfsdjavaeereJAVAdsfd");
		//要求把第一个小写的java换成大写的,第二个大写的JAVA换成小写的
		int i = 0;
		while(m.find()) {
			i++;
			if(i%2== 0) {
				m.appendReplacement(buf, "java");
			}else{
				m.appendReplacement(buf, "JAVA");
			}
		}
		m.appendTail(buf);
		p(buf);