Java 进阶——正则表达式语法详解及灵活使用正则高效操作字符串

版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/CrazyMo_/article/details/94492302


毫不夸张地说正则表达式设计之初,就是服务于字符串的,换言之,很多情况下 使用正则表达式操作字符串都是最高效的。

一、正则表达式的基本语法

所谓正则表达式,就是用一些特定的符号来替代一些代码逻辑,把这些特殊符号直接组合起来就形成了正则表达式,因此学习正则表达式就是学习一些特殊符号(相当于是一些HTML 的标签),每一种特殊符号都代表一种代码含义。

1、字符类的特殊符号

所谓字符类的特殊符号就是专门操作某一个位置上的字符的,一个特殊符号仅仅代表一个长度的字符,如果特殊字符带“\”在正则表达式里面时需要处理转义字符“\”,如果不需要指定范围就不需要使用“[]”,单个字符就直接写单个字符。

特殊字符 说明
[abc] 仅仅是代表字符串中的一个位置上的一个字符,这个位置上的字符是a或b或c,String regex=“[abc][e
[^abc] 这个位置上可以是任何字符,除了a、b、c。
[a-zA-Z] a到z 或者 A到Z,两头的字母都包含在范围内
[a-d[m-p]] 取a到d 与 m到p的并集
[a-z&&[def]] 取a到z与d或者e或者f的交集
[a-z&&[^bc]] a到z,除了b和c
[a-z&&[^m-p]] a到z且不在m到p的范围内
. 任意字符
\d 任意数字 [0-9],两种写法都可以,下同
\D 非数字 [^0-9]
\s 空白字符[\t\n\f\r\x0b]
\S 非空白字符[^\s]
\w 单词字符[a-zA-Z_0-9]
\W 非单词字符[^\w]
* 代表任意字符,任意长度的字符
String regex=[abc][e]; ];//这个正则表达式匹配的字符串是一个以a或b或c开头,第二个字母是e的长度为2的字符串。
“ae”.matches(regex);//true
“a”.matches(regex);//false
“ae2”.matches(regex);//false

2、标示范围的特殊符号

特殊符号 说明
{n} 精确匹配的次数,可以看成是n个长度
{n,} 匹配n次以上
{n,m} 匹配n-m次以上
^ 匹配一个输入或一行的开头,/^a/匹配"an A",而不匹配"An a"
$ 匹配一个输入或一行的结尾,/a$/匹配"An a",而不匹配"an A"
* 匹配前面元字符0次或多次,/ba*/将匹配b,ba,baa,baaa
+ 匹配前面元字符1次或多次,/ba+/将匹配ba,baa,baaa
? 匹配前面元字符0次或1次,/ba?/将匹配b,ba
(x) 组匹配x保存x在名为$1…$9的变量中,比如说(.)\1表示第一位字符为任意字符,但第二位与第一位取值相同
xIy 匹配x或y

常用的类型符号:

数字:  ^[0-9]*$
n位的数字:  ^\d{n}$
至少n位的数字:  ^\d{n,}$
m-n位的数字:  ^\d{m,n}$
零和非零开头的数字:  ^(0|[1-9][0-9]*)$
非零开头的最多带两位小数的数字:  ^([1-9][0-9]*)+(.[0-9]{1,2})?$
带1-2位小数的正数或负数:  ^(\-)?\d+(\.\d{1,2})?$
正数、负数、和小数:  ^(\-|\+)?\d+(\.\d+)?$
有两位小数的正实数:  ^[0-9]+(.[0-9]{2})?$
有1~3位小数的正实数:  ^[0-9]+(.[0-9]{1,3})?$
非零的正整数:  ^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
非零的负整数:  ^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
非负整数:  ^\d+$ 或 ^[1-9]\d*|0$
非正整数:  ^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
非负浮点数:  ^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
非正浮点数:  ^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
正浮点数:  ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
负浮点数:  ^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
浮点数:  ^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

更多内容请点阅

3、边界匹配器的特殊符号

特殊符号 说明
^ 行的开头
$ 行的结尾
\b 单词的边界
\B 非单词的边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符
\z 输入的结尾

二、使用正则表达式匹配字符串

String类中有个**matches(String regex)**方法,当需要判断给定的字符串是否符合预定的格式时,只需要传递对应的正则表达式字符串调用matches方法,就可以判断当前字符串是否符合正则表达式的规则。

String reg="y[a-z]\\d*";//以y开头,第二字符为a到z的字符,第三个字符为数字,长度为3
System.out.println("ya7".matches(reg));//true
System.out.println("ya11".matches(reg));//false
String reg2="[a-z]{3}";
System.out.println("yazs".matches(reg2));//false

三、使用正则表达式分割或替换字符串

可以使用正则表达式作为切割标记来分割字符串,也可以使用正则表达式把字符串中与正则表达式匹配的部分替换。

String reg3="\\.+";//按照多个.进行分割
System.out.println(("hjhjh..ss..s...s".split(reg3)).length);
String reg4="j[a-z]";
String[] arr="hjtyujsss".split(reg4);////h yu ss 
String reg5="(.)\\1+";//按照叠词分割
String[] arr2="jhgaaytrbbbuyp".split(reg5);//jhg ytr uyp
for(int i=0;i<arr2.length;i++){
System.out.println(arr2[i]); 
}
String str="黄21金客户67676就回GYUY212哈哈哈";
String reg6="\\d{3,}";//把连续出现3次或以上的数字替换为#
str=str.replaceAll(reg6, "#");
System.out.println(str); //黄21金客户#就回GYUY#哈哈哈
String str2="黄aa金客户bbb就回ccc哈哈哈";
String reg7="(.)\\1+";
str2=str2.replaceAll(reg7, "$1");//把叠词替换为单个字
System.out.println(str2); //黄a金客户b就回c哈

四、使用正则表达式获取字符串子串

使用正则表达式获取字符串子串的一般步骤:

  • 将正则表达式封装成对象
  • 让正则表达式对象和要操作的源字符串相比较
  • 关联后,获取正则匹配引擎
  • 通过引擎对符合正则表达式的子串进行操作
String reg8="\\b[a-z]{4}\\b";//取4个字符组成的词
String r="ming tian you yao kai shi shang ban le haha !";
//String中的matches、replaceAll方法都是Pattern结合使用Matcher实现的
Pattern pattern=Pattern.compile(reg8);//构造Pattern对象
Matcher matcher=pattern.matcher(r);//与源字符串相关联
//matches 用于整个源串的
//查找符合规则的子串,逐字符查找匹配,如果当前字符不符合正则,则遍历下一个字符,反之符合的话会继续往下查找
while(matcher.find()){
System.out.println(matcher.group());
System.out.println(matcher.start()+"---"+matcher.end());//子串在源串中起始和结束的索引位置

猜你喜欢

转载自blog.csdn.net/CrazyMo_/article/details/94492302