Java使⽤正则表达式检索、替换String中特定字符和正则
表达式的⼀切
引⾔
String这个对于程序原来说⼀定是最熟悉不过的,很多时候我们都习惯去使⽤String的原⽣⽅法去完成查字符串、替换、删除,⽽正则表达式由于略显苦涩的语法常常被⼈忽略,其实很多时候使⽤正则表达式可以提⾼不少性能和节省资源。
⼀、正则表达式简述
正则表达式正则表达是Java中⽐较⽭盾的知识点,因为使⽤起来可以很简单也可以相当地有难度,但是对于字符串操作来说应⽤得当则事半功倍,字符串查,搜索,匹配,替换等等,正则表达式⽆所不能。⽽所谓正则表达式本质就是⼀个字符串(这个字符串按照⼀定的语法和规范被构造出来作为限定条件),其主要参与者——Pattern和Matcher:Pattern是Java正则表达式API中的主要⼊⼝,是程序语⾔中对这个特殊正则字符串的编译表⽰,需要使⽤正则表达式,第⼀步都是从构造Pattern 类开始,⽽Matcher是输⼊字符串进⾏解释和匹配操作的引擎,通过解释 Pattern 对 Character sequence 执⾏匹配操作(即Matcher负责完成字符串的查、匹配、替换等操作。)
⼆、正则表达式基本语法
1、预留字符
限定
说明
符
.任意英⽂字母⽐如a-z,表⽰从a到z
当该字符紧跟在任何⼀个其他限制符(*,+,?,{n},{n,},{n,m})后⾯时,匹配模式是⾮贪婪的。⾮贪婪模式尽可能少的匹配所搜索的字符串,⽽默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,⽽“o+”将匹配所有“o”。
\反斜杠, 单独的反斜杠做为转义字符,与其他特殊字符⼀起使⽤。如果想匹配反斜杠本⾝,需要转义。两个反斜杠实际匹配⼀个反斜杠n字符的8进制表⽰.n 在0⾄7之间取值
nn字符的8进制表⽰.n 在0⾄7之间取值
mnn字符的8进制表⽰. m 在0⾄3之间取值, n 在0⾄7之间取值
hh字符的16进制表⽰.
\uhhhh字符的16进制表⽰ 0xhhhh. 对应unicode 编码字符
\t缩进符.
\n换⾏符 (unicode: ‘\u000A')
\r回车符 (unicode: ‘\u000D')
\f制表符 (unicode: ‘\u000C')
\a警报(铃声)字符 (unicode: ‘\u0007′)
\e转义符 (unicode: ‘\u001B')
\cx控制符 x
\d匹配任意数字 [0-9]
\D匹配任意⾮数字 [^0-9]
\s匹配任意空⽩符 (空格, 缩进, 换⾏,回车)
\S匹配任意⾮空⽩符
\w匹配任意单词
\W匹配任意⾮单词
2、设置指定限定条件**[]**(即“[]”表⽰的是中括符⾥的内容是条件)
限定符说明
[a-z]匹配⼩写a to z范围中任⼀个字符,⼜如[abc] 匹配 a, 或 b 或 c
[A-Z]匹配⼤写A to Z范围中任⼀个字符
[a-zA-Z]匹配⼩写a to z或⼤写A to Z范围中⼀个字符
[0-9]匹配⼩写0 to 9范围中⼀个字符
[0-9a-z]匹配⼩写0 to 9或a to z范围中⼀个字符
[0-9[a-z]]匹配⼩写0 to 9或a to z范围中⼀个字符(交集)
[^abc]匹配不是a,b,c 的字符,是否定匹配
[^abc]匹配不是a,b,c 的字符,是否定匹配
限定符说明
[a-zA-Z]匹配a 到 z ,A到Z 直接的字符,是范围匹配
[a-d[m-p]]匹配a到d之间字符或 m到p之间字符,是并集匹配
[a-z&&[def]]匹配 d, e, 或 f. 是交集匹配 (这⾥是在范围 a-z和字符def之间取交集).
[a-z&&[^bc]]匹配a-z 之间所有字符,排除bc的字符。是减法匹配
[a-z&&[^m-p]]匹配a-z 之间所有字符,排除m-p之间的字符是减法匹配
3、边界匹配
边界符说明
^匹配⾏⾸
$匹配⾏尾
\b匹配单词边界
\B匹配⾮单词边界
\A匹配⽂本开头
\G匹配前⼀匹配项结尾
\Z输⼊的结尾,仅⽤于最后的结束符(如果有的话)
\z匹配⽂本结尾
4、逻辑操作符和量词表⽰
正则表达式⽀持少量的逻辑运算(与,或)。与操作是默认的,表达式 cmo,意味着c 与 m与o。或操作需要显⽰指定,⽤ | 表⽰。例如表达式 crazy|mo意味着crazy或 mo。
贪婪模式饥饿模式独占模式:说明:
X?X??X?+匹配0或1次,即出现X 0或者1次
X*X**?X*+匹配0或多次
X+X+?X++匹配1或多次
X{n}X{n}?X{n}+匹配n次
X{n,}X{n,}?X{n,}+匹配最少n次
X{n, m}X{n, m}?X{n, m}+匹配最少n次,最多m次
可参考
三、正则表达式的应⽤
编译正则表达式的字符串值构造对应的模式Pattern对象
创建匹配给定输⼊与此模式的匹配器Matcher
通过匹配器对象执⾏操作,匹配器对象的⽅法很丰富,互相组合使⽤更加强⼤()
1、去掉字符串中的空格和换⾏符
public static String getNonBlankStr(String str) {
if(str!=null && !"".equals(str)) {
Pattern pattern = Patternpile("\\s*|\t|\r|\n"); //去掉空格符合换⾏符
Matcher matcher = pattern.matcher(str);
String result = placeAll("");
return result;
}else {
return str;
}
}
2、去掉指定特殊字符
public static String StringFilter(String str) throws PatternSyntaxException {
// String regEx = "[^a-zA-Z0-9]"; // 只允许字母和数字
// 清除掉所有特殊字符(除了~之外)
String regEx="[`!@#$%^&*()+=|{}':;',//[//].<>/?!@#¥%……&*()——+|{}【】‘;:”“'。,、?]";
Pattern pattern = Patternpile(regEx);
Matcher matcher = pattern.matcher(str);
return placeAll("").trim();
}
3、Pattern.matches()检查字符串中是否存在指定字符
replaceall()
public static String StringFilter(String str) throws PatternSyntaxException {
// String regEx = "[^a-zA-Z0-9]"; // 只允许字母和数字
// 清除掉所有特殊字符(除了~之外)
String regEx="[`!@#$%^&*()+=|{}':;',//[//].<>/?!@#¥%……&*()——+|{}【】‘;:”“'。,、?]";
Pattern pattern = Patternpile(regEx);
Matcher matcher = pattern.matcher(str);
return placeAll("").trim();
}
4、Pattern.split()⽤正则表达式作为分隔符,把⽂本分割为String类型的数组
/**
* 结果:element = grjk Text
element = wwwdsf
element = Many
element = egsdg r geg
*/
String text = "A reg grjk Text reg wwwdsf reg Many reg egsdg r geg";
String patternString = "reg";
Pattern pattern = Patternpile(patternString);
String[] split = pattern.split(text);
for(String element : split){
System.out.println("element = " + element);
}
5、Matcher 实例的find() + start() + end()寻字符串中指定字符串出现的次数和起始和结束的索引位置
/**
*结果:found: 1 : 2 - 4
found: 2 : 5 - 7
found: 3 : 23 - 25
found: 4 : 70 - 72
*/
String text ="This is the text which is to be searched " +"for occurrences of the word 'is'.";
String patternString = "is";
Pattern pattern = Patternpile(patternString);
Matcher matcher = pattern.matcher(text);
int count = 0;
while(matcher.find()) {
count++;
System.out.println("found: " + count + " : " + matcher.start() + " - " + d());
}
6、Matcher 匹配指定格式的特殊字符串
Pattern pattern = Patternpile("[0-9]*");//判断是否都是数字
Matcher isNum = pattern.matcher("1123是数字");
if(isNum.matches()) {
System.out.println("全部是数字");
} else {
System.out.println("有汉字");
}
//匹配任意字符串中包含形如“@数字&”格式的⼦串
String st="看,墙⾯上的雕塑是什么?@322&⼤家⼀定猜到了,这是⼀个神经元。汇区的研院校及企业资源,促进产学研医多个环节上的相互合作与交融"; Pattern pattern = Patternpile("^(.*)@-?[1-9]\\d*&(.*)$"); //去掉空格符合换⾏符
Matcher matcher = pattern.matcher(st);
boolean result = matcher.find();
待续…
总结
到此这篇关于Java使⽤正则表达式检索、替换String中特定字符和正则表达式的⼀切的⽂章就介绍到这了,更多相关Java正则
表达式检索、替换String特定字符内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论