飞道的博客

正则表达式java应用

432人阅读  评论(0)

正则表达式java应用

正则表达式其实就是一个字符串识别的规则,首先设定好规则,然后程序根据这个规则识别比较

在Java里面使用正则表达式需要涉及到两个PatternMatcher。Pattern和Matcher之间的关系就好比Pattern是做模具的师傅,pattern将模具(正则表达)做好之后,指派一个小工(matcher)去匹配,matcher要做的就是原材料(即要被匹配的源字符串)和模具(即Pattern中的正则表达式)配对、比较

Java正则表达式应用

判断功能

  • public boolean matches(String regex)
String s = "13839120000";
String regex = "1[38]\\d{9}";//定义手机好规则
boolean flag = s.matches(regex);//判断功能
System.out.println("flag:"+flag);

分割功能

  • public String[] split(String regex)
String s = "18-24";
String regex = "-";
String[] strArr = s.split(regex);

替换功能

  • public String replaceAll(String regex,String replacement)
String s = "12342jasfkgnas234";
//把字符串里面的数字替换成*
String regex = "\\d";
String ss = "*";
String result = s.replaceAll(regex,ss);
System.out.println(result);

单个符号

英文句点.符号 : 匹配除换行符以外的任意字符

表达式t.o 可以匹配:tno,t#o,teo等等。不可以匹配:tnno,to,Tno,t正o等。

例子:\bhi\b.*\bLucy\b

  • \b是正则表达式规定的一个特殊代码(好吧,某些人叫它元字符,metacharacter),代表着单词的开头或结尾,也就是单词的分界处(只匹配一个位置)
  • .是另一个元字符,匹配除了换行符以外的任意字符。
  • *同样是元字符,不过它代表的不是字符,也不是位置,而是数量——它指定*前边的内容可以连续重复使用任意次以使整个表达式得到匹配。

因此,.*连在一起就意味着任意数量的不包含换行的字符。现在\bhi\b.*\bLucy\b的意思:先是一个单词hi,然后是任意个任意字符(但不能是换行),最后是Lucy这个单词

中括号[] : 只有方括号里面指定的字符才参与匹配,也只能匹配单个字符。

表达式:t[abcd]n 只可以匹配:tan,tbn,tcn,tdn。不可以匹配:thn,tabn,tn等。

| 符号 : 相当与“或”,可以匹配指定的字符,但是也只能选择其中一项进行匹配。

表达式:t(a|b|c|dd)n 只可以匹配:tan,tbn,tcn,tddn。不可以匹配taan,tn,tabcn等。

表示匹配次数

  • * : 0次或者多次
  • + : 1次或者多次
  • ? : 0次或者1次
  • {n} : 恰好n次
  • {n,m} : 从n次到m次,m可以不填,表示不限次数

注意:在使用group方法时,如果不加匹配次数,则默认匹配字符个数是单个字符

String regex = "[^abc]";    //没有添加次数,默认匹配单个字符
String regex1 = "[^abc]{1,}";   //添加了次数{1,},至少一次
Pattern pattern1 = Pattern.compile(regex);
Matcher matcher = pattern1.matcher("TESTaaaTEST2");
while (matcher.find()) {
    System.out.println(matcher.group());
}

^符号:表示限定开头或否,如果用在方括号内[ ],^表示不想匹配的字符。

  • 限定开头:要想匹配行首的字符要使用抑扬字符()——有时也被叫做插入符。例如,想找到text.txt中行首"he"打头的行,你可能会先用简单表达式he,但是这会匹配第三行的the,所以要使用正则表达式he,它只匹配在行首出现的he。
//限定开头
/[(^\s+)(\s+$)]/g   //在[]中使用,不包括嵌套使用
(^cat)$
(^cat$)
^(cat)$
^(cat$)
  • (否)取反:有时候指定“除了×××都匹配”会比较容易达到目的,当抑扬字符(^)出现方括号中时,它表示“排除”,例如要匹配he ,但是排除前面是t or s的情形(也就是the和she),可以使用:[^st]he。
//表示否
[^a]表示“匹配除了a的任意字符”。
[^a-zA-Z0-9]表示“找到一个非字母也非数字的字符”。
[\^abc]表示“找到一个插入符或者a或者b或者c”。

只要是 ^ 这个字符是在中括号[]中被使用的话就是表示字符类的否定,如果不是的话就是表示限定开头。我这里说的是直接在[]中使用,不包括嵌套使用。

\S符号:非空字符

\s符号:空字符,只可以匹配一个空格、制表符、回车符、换页符,不可以匹配自己输入的多个空格。

\t符号: 匹配制表符

\n符号: 匹配一个换行符

\r符号:匹配一个回车符,与\n、\tab相同

\f符号:匹配一个换页符

\b符号:匹配一个单词的边界,也就是指单词和空格间的位置

正则表达式的“匹配”有两种概念,一种是匹配字符,一种是匹配位置,这里的\b就是匹配位置的。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”;“\b1_”可以匹配“1_23”中的“1_”,但不能匹配“21_3”中的“1_”。

快捷符号

\d : 表示[0-9]

\D : 表示[^0-9]

\w : 表示[0-9A-Za-z_],匹配下划线的任何单词字符

\W : 表示[^0-9A-Za-z_],匹配任何非单词字符

\s : 表示[\t\n\r\f]

\S : 表示[^\t\n\r\f]

示例

\ba\w*\b // 匹配以字母a开头的单词

\d+ // 匹配1个或更多连续的数字

\bw{6}\b // 匹配刚好6个字符的单词

String regex8 = "^[0][0-9]{2,3}-[0-9]{5,10}$";// 校验带区号座机电话

String regex7 = "^[1][3,4,5,7,8][0-9]{9}$";
String regExp = "^[1]([3][0-9]{1}|59|58|88|89)[0-9]{8}$";//校验手机号码


// 定义判别用户身份证号的正则表达式(15位或者18位,最后一位可以为字母)
String regularExpression = "(^[1-9]\\d{5}(18|19|20)\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|" +
        "(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}$)";
//假设18位身份证号码:41000119910101123X  410001 19910101 123X
//^开头
//[1-9] 第一位1-9中的一个      4
//\\d{5} 五位数字           10001(前六位省市县地区)
//(18|19|20)                19(现阶段可能取值范围18xx-20xx年)
//\\d{2}                    91(年份)
//((0[1-9])|(10|11|12))     01(月份)
//(([0-2][1-9])|10|20|30|31)01(日期)
//\\d{3} 三位数字            123(第十七位奇数代表男,偶数代表女)
//[0-9Xx] 0123456789Xx其中的一个 X(第十八位为校验值)
//$结尾

//假设15位身份证号码:410001910101123  410001 910101 123
//^开头
//[1-9] 第一位1-9中的一个      4
//\\d{5} 五位数字           10001(前六位省市县地区)
//\\d{2}                    91(年份)
//((0[1-9])|(10|11|12))     01(月份)
//(([0-2][1-9])|10|20|30|31)01(日期)
//\\d{3} 三位数字            123(第十五位奇数代表男,偶数代表女),15位身份证不含X
//$结尾

参考

java正则表达式应用

正则表达式

正则表达式


转载:https://blog.csdn.net/baidu_35181420/article/details/105692066
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场