Java使用正则表达式检索、替换String中特定字符和正则表达式的一切

 更新时间:2020年09月02日 11:17:50   作者:CrazyMo_  
这篇文章主要给大家介绍了关于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之间取值
\xhh 字符的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 的字符,是否定匹配
[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

通过匹配器对象执行操作,匹配器对象的方法很丰富,互相组合使用更加强大(JDK在线API

1、去掉字符串中的空格和换行符

public static String getNonBlankStr(String str) {  
  if(str!=null && !"".equals(str)) {  
   Pattern pattern = Pattern.compile("\\s*|\t|\r|\n"); //去掉空格符合换行符  
   Matcher matcher = pattern.matcher(str);  
   String result = matcher.replaceAll("");  
   return result;  
  }else {  
   return str;  
  }   
 } 

2、去掉指定特殊字符

public  static  String StringFilter(String  str)  throws PatternSyntaxException {
 
  // String  regEx = "[^a-zA-Z0-9]"; // 只允许字母和数字
  // 清除掉所有特殊字符(除了~之外)
  String regEx="[`!@#$%^&*()+=|{}':;',//[//].<>/?!@#¥%……&*()??+|{}【】‘;:”“'。,、?]";
  Pattern pattern  =  Pattern.compile(regEx);
  Matcher matcher  =  pattern.matcher(str);
  return  matcher.replaceAll("").trim();
}

3、Pattern.matches()检查字符串中是否存在指定字符

public  static  String StringFilter(String  str)  throws PatternSyntaxException {
 
  // String  regEx = "[^a-zA-Z0-9]"; // 只允许字母和数字
  // 清除掉所有特殊字符(除了~之外)
  String regEx="[`!@#$%^&*()+=|{}':;',//[//].<>/?!@#¥%……&*()??+|{}【】‘;:”“'。,、?]";
  Pattern pattern  =  Pattern.compile(regEx);
  Matcher matcher  =  pattern.matcher(str);
  return  matcher.replaceAll("").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 = Pattern.compile(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 = Pattern.compile(patternString);				
Matcher matcher = pattern.matcher(text);
int count = 0;
while(matcher.find()) {				
  count++;				
  System.out.println("found: " + count + " : " + matcher.start() + " - " + matcher.end());				
}

6、Matcher 匹配指定格式的特殊字符串

		Pattern pattern = Pattern.compile("[0-9]*");//判断是否都是数字
    Matcher isNum = pattern.matcher("1123是数字");
    if(isNum.matches()) {
      System.out.println("全部是数字");
    } else {
      System.out.println("有汉字");
    }

		//匹配任意字符串中包含形如“@数字&”格式的子串
		String st="看,墙面上的雕塑是什么?@322&大家一定猜到了,这是一个神经元。汇区的研院校及企业资源,促进产学研医多个环节上的相互合作与交融";
		Pattern pattern = Pattern.compile("^(.*)@-?[1-9]\\d*&(.*)$"); //去掉空格符合换行符
		 Matcher matcher = pattern.matcher(st);
		 boolean result = matcher.find();

待续…

总结

到此这篇关于Java使用正则表达式检索、替换String中特定字符和正则表达式的一切的文章就介绍到这了,更多相关Java正则表达式检索、替换String特定字符内容请搜索得牛网以前的文章或继续浏览下面的相关文章希望大家以后多多支持得牛网!

相关文章

  • 执行java请求时导致在脚本执行结束时JVM无法退出

    执行java请求时导致在脚本执行结束时JVM无法退出

    这篇文章主要介绍了执行java请求,导致在脚本执行结束时JVM无法退出问题,本文通过原因分析给出解决方案,需要的朋友可以参考下
    2020-02-02
  • java9学习笔记之模块化详解

    java9学习笔记之模块化详解

    Java 9中最重要的功能,毫无疑问就是模块化(Module),下面这篇文章主要给大家介绍了关于java9学习笔记之模块化的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2018-04-04
  • Java中获取子字符串的几种方法示例

    Java中获取子字符串的几种方法示例

    这篇文章主要主要给大家总结了Java中获取子字符串的几种方法,分别是采用split的方式、采用indexOf的方式、正则和采用replaceFirst的方式这四种方法,需要的朋友可以参考借鉴,下面来看看详细的介绍吧
    2017-01-01
  • JAVA开发环境搭建教程

    JAVA开发环境搭建教程

    这篇文章主要为大家详细介绍了JAVA开发环境搭建教程,配置JAVA开发环境,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • 简单理解遵循接口隔离原则的Java设计模式编程

    简单理解遵循接口隔离原则的Java设计模式编程

    这篇文章主要介绍了遵循接口隔离原则的Java设计模式编程,针对Java编程中interface接口方面的编写进行约束,需要的朋友可以参考下
    2016-02-02
  • 浅谈Java注解和动态代理

    浅谈Java注解和动态代理

    这篇文章主要介绍了Java中有关注解和动态代理的一些知识,涉及了Annotation、数据类型等相关内容,需要的朋友可以参考下。
    2017-09-09
  • Java读取TXT文件内容的方法

    Java读取TXT文件内容的方法

    本篇文章主要介绍了Java读取TXT文件内容的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • java为何不能多继承的原因详解

    java为何不能多继承的原因详解

    多重继承是一个子类从多个父类中继承属性和方法。C++, Common Lisp是时下支持多重继承的流行语言。那java为何不能多继承呢,下面小编带大家来一起学习一下吧
    2019-06-06
  • Mybatis调用MySQL存储过程的简单实现

    Mybatis调用MySQL存储过程的简单实现

    本篇文章主要介绍了Mybatis调用MySQL存储过程的简单实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • Eclipse中实现JS代码提示功能(图文教程)

    Eclipse中实现JS代码提示功能(图文教程)

    本文通过图文并茂的形式给大家介绍了Eclipse中实现JS代码提示功能,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-11-11

最新评论