Java正则表达式教程及示例

当我开始使用Java时,正则表达式对我来说是一场噩梦。 本教程旨在帮助您掌握Java正则表达式,并让我定期返回以刷新我的正则表达式学习。

什么是正则表达式?

正则表达式定义字符串的模式。 正则表达式可用于搜索,编辑或处理文本。 正则表达式不是特定于语言的,但是每种语言的正则表达式略有不同。 Java正则表达式与Perl最相似。

Java正则表达式类存在于java.util.regex软件包中,该软件包包含三个类: PatternMatcherPatternSyntaxException

1.模式对象是正则表达式的编译版本。 它没有任何公共构造函数,我们使用其公共静态方法compile通过传递正则表达式参数来创建模式对象。

2. Matcher是将输入的字符串模式与创建的模式对象进行匹配的正则表达式引擎对象。 此类没有任何公共构造函数,并且我们使用模式对象匹配器方法(将输入String作为参数)来获得Matcher对象。 然后,我们使用matchs方法根据输入的String是否匹配正则表达式模式返回布尔结果。

3.如果正则表达式语法不正确,则会引发PatternSyntaxException。

让我们通过一个简单的示例查看所有这些类的作用:

package com.journaldev.util;import java.util.regex.*;public class PatternExample {public static void main(String[] args) {Pattern pattern = Pattern.compile('.xx.');Matcher matcher = pattern.matcher('MxxY');System.out.println('Input String matches regex - '+matcher.matches());// bad regular expressionpattern = Pattern.compile('*xx*');}}

上面程序的输出是:

Input String matches regex - true
Exception in thread 'main' java.util.regex.PatternSyntaxException: Dangling meta character '*' near index 0
*xx*
^at java.util.regex.Pattern.error(Pattern.java:1924)at java.util.regex.Pattern.sequence(Pattern.java:2090)at java.util.regex.Pattern.expr(Pattern.java:1964)at java.util.regex.Pattern.compile(Pattern.java:1665)at java.util.regex.Pattern.(Pattern.java:1337)at java.util.regex.Pattern.compile(Pattern.java:1022)at com.journaldev.util.PatternExample.main(PatternExample.java:13)

由于正则表达式围绕String展开,因此Java 1.4中对String类进行了扩展,以提供进行模式匹配的match方法。 在内部,它使用Pattern和Matcher类进行处理,但是显然,它减少了代码行。

模式类还包含matches方法,该方法以正则表达式和输入String作为参数,并在匹配它们后返回布尔结果。

因此,以下代码可以很好地将输入String与正则表达式匹配。

String str = 'bbb';System.out.println('Using String matches method: '+str.matches('.bb'));System.out.println('Using Pattern matches method: '+Pattern.matches('.bb', str));

因此,如果您只需要检查输入的String是否与模式匹配,则应使用简单的String Match方法来节省时间。 仅在需要操纵输入String或需要重用模式时,才使用Pattern和Matches类。

请注意,由正则表达式定义的模式从左到右应用于字符串,并且一旦在匹配项中使用了源字符,就无法重用它。

例如,正则表达式“ 121”将匹配“ 31212142121”的次数是“ _121____121”的两倍。

正则表达式常见的匹配符号

正则表达式 描述
匹配任何单个符号,包括所有内容 (“ ..”,“ a%”)– true(“ ..”,“。a”)– true

(“ ..”,“ a”)–否

^ xxx 在行首匹配xxx正则表达式 (“ ^ ac”,“ abcd”)– true(“ ^ a”,“ a”)– true

(“ ^ a”,“ ac”)–否

xxx $ 在行尾匹配正则表达式xxx (“ .cd $”,“ abcd”)–真(“ a $”,“ a”)–真

(“ a $”,“ aca”)–否

[abc] 可以匹配字母a,b或c。 []被称为字符类。 (“ ^ [abc] d。”,“ ad9”)–正确(“ [ab] .d $”,“坏”)–正确

(“ [ab] x”,“ cx”)–否

[abc] [12] 可以匹配a,b或c,然后匹配1或2 (“ [ab] [12]。”,“ a2#”)– true(“ [ab] .. [12]”,“ acd2”)– true

(“ [ab] [12]”,“ c2”)–否

[^ abc] 当^是[]中的第一个字符时,它会否定模式,匹配除a,b或c之外的任何其他字符 (“ [[^ ab] [^ 12]。”,“ c3#”)–真(“ [[^ ab] .. [^ 12]”,“ xcd3”)–真

(“ [^ ab] [^ 12]”,“ c2”)–否

[a-e1-8] 匹配范围从a到e或1到8 (“ [a-e1-3]”,“ d#”)–真(“ [a-e1-3]”,“ 2”)-真

(“ [a-e1-3]”,“ f2”)–否

xx | yy 匹配正则表达式xx或yy (“ x。| y”,“ xa”)– true(“ x。| y”,“ y”)

(“ x。| y”,“ yz”)–否


Java正则表达式元字符

正则表达式 描述
\ d 任何数字,少于[0-9]
\ D 任何非数字,是[^ 0-9]的缩写
\ s 任何空格字符,是[\ t \ n \ x0B \ f \ r]的缩写
\ S 任何非空白字符,是[^ \ s]的缩写
\ w 任何文字字符,是[a-zA-Z_0-9]的缩写
\ W 任何非单词字符,是[^ \ w]的缩写
\ b 单词边界
\ B 非单词边界

在正则表达式中有两种方法可以将元字符用作普通字符。

  1. 在元字符之前加一个反斜杠(\)。
  2. 保持元字符在\ Q(以引号开头)和\ E(以引号结尾)之内。


正则表达式量词

量词指定要匹配的字符的出现次数。

正则表达式 描述
X? x发生一次或根本不发生
X* X出现零次或多次
X + X发生一次或多次
X {n} X正好发生n次
X {n,} X出现n次或更多次
X {n,m} X发生至少n次但不超过m次

量词也可以与字符类和捕获组一起使用。

例如,[abc] +表示a,b或c一次或多次。

(abc)+表示“ abc”组再出现一次。 我们现在将讨论捕获组

正则表达式捕获组

捕获组用于将多个字符视为一个单元。 您可以使用()创建一个组。 输入String与捕获组匹配的部分被保存到内存中,可以使用Backreference进行调用。

您可以使用matcher.groupCount方法找出正则表达式模式中的捕获组数。 例如在((a)(bc))中包含3个捕获组; ((a)(bc)),(a)和(bc)。

您可以在正则表达式中使用反引号 (\),然后再调用要调用的组数。

捕获组和反向引用可能会造成混淆,因此让我们通过一个示例来理解它。

System.out.println(Pattern.matches('(\\w\\d)\\1', 'a2a2')); //trueSystem.out.println(Pattern.matches('(\\w\\d)\\1', 'a2b2')); //falseSystem.out.println(Pattern.matches('(AB)(B\\d)\\2\\1', 'ABB2B2AB')); //trueSystem.out.println(Pattern.matches('(AB)(B\\d)\\2\\1', 'ABB2B3AB')); //false

在第一个示例中,在运行时,第一个捕获组是(\ w \ d),当与输入字符串“ a2a2”匹配并保存在内存中时,其计算结果为“ a2”。 因此\ 1指的是“ a2”,因此它返回true。 由于相同的原因,第二条语句打印为false。
尝试自己了解语句3和4的这种情况。

现在,我们将研究一些重要的Pattern和Matcher类方法。

我们可以创建带有标志的Pattern对象。 例如模式。 CASE_INSENSITIVE启用不区分大小写的匹配。

模式类还提供了类似于String类split()方法的split(String)
模式类toString()方法返回从中编译此模式的正则表达式String。

Matcher类具有start()end()索引方法,这些方法精确显示在输入字符串中找到匹配项的位置。

Matcher类还提供String操作方法replaceAll(String替换)replaceFirst(String替换)

现在,我们将通过一个简单的java类看到这些常用功能:

package com.journaldev.util;import java.util.regex.Matcher;
import java.util.regex.Pattern;public class RegexExamples {public static void main(String[] args) {// using pattern with flagsPattern pattern = Pattern.compile('ab', Pattern.CASE_INSENSITIVE);Matcher matcher = pattern.matcher('ABcabdAb');// using Matcher find(), group(), start() and end() methodswhile (matcher.find()) {System.out.println('Found the text \'' + matcher.group()+ '\' starting at ' + matcher.start()+ ' index and ending at index ' + matcher.end());}// using Pattern split() methodpattern = Pattern.compile('\\W');String[] words = pattern.split('one@two#three:four$five');for (String s : words) {System.out.println('Split using Pattern.split(): ' + s);}// using Matcher.replaceFirst() and replaceAll() methodspattern = Pattern.compile('1*2');matcher = pattern.matcher('11234512678');System.out.println('Using replaceAll: ' + matcher.replaceAll('_'));System.out.println('Using replaceFirst: ' + matcher.replaceFirst('_'));}}

上面程序的输出是:

Found the text 'AB' starting at 0 index and ending at index 2
Found the text 'ab' starting at 3 index and ending at index 5
Found the text 'Ab' starting at 6 index and ending at index 8
Split using Pattern.split(): one
Split using Pattern.split(): two
Split using Pattern.split(): three
Split using Pattern.split(): four
Split using Pattern.split(): five
Using replaceAll: _345_678
Using replaceFirst: _34512678

正则表达式是Java面试问题的领域之一,在接下来的几篇文章中,我将提供一些实际示例。

参考: 开发人员食谱博客上的JCG合作伙伴 Pankaj Kumar的Java正则表达式示例教程 。

翻译自: https://www.javacodegeeks.com/2012/11/java-regular-expression-tutorial-with-examples.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue2.0 --- vue-cli脚手架中全局引入JQ

第一步:安装jQuery npm/cmpn方式安装(默认安装1.7.X版本的JQ) npm/cnpm install jQuery 如果想安装更高版本的JQ那么可以选择在package.json文件下面这个位置添加代码断(当前图片安装的是2.2.3版本,如果想安装更高或者其他可以更改版本号&…

python笔记全_Python笔记

一、数据结构和序列1.1、元组:有一种固定长度,不可修改的python对象序列tup 1,2,3 tup : (1,2,3)tup tuple([4,0,2]) tup : (4,0,2)tup[0] 4元组添加元素:tup (["foo",[1,2],True])tup[1].append(3)tup : ("foo",[1,…

java 分布式编译_linux分布式编译distcc和ccache的部署

unset LANGUAGEexport LANG"en"cd /home/kingsoftmkdir distcccd distccrpm包用:rpm -ivh ...bz2包用:tar -xvf ...进入distcc解压后的目录./configure && make && make installmkdir /usr/lib/distccmkdir /usr/lib/distcc/b…

Unity——用UnityEditor拷贝FBX中的AnimationClip

最近有个新需求,要用代码添加动画的事件,但是Unity不能直接修改FBX中的AnimationClip 在Animation窗口中可以看到,AnimationClip是Read-Only状态,用代码修改这个AnimationClip也是不会生效的,包括用代码添加事件 解决方…

sql 分页存储过程

ALTER procedure [dbo].[fenye]pagesize int, --每页显示数量pageCurrent int, --当前页tablename varchar(20), --表名field varchar(20), --显示的列名(eg: id,name)where varchar(20), --筛选条件 (eg: name not null)orderBy varchar(20), --排序的列名(eg: id …

使用Hadoop计算共现矩阵

这篇文章继续我们在MapReduce的数据密集型文本处理一书中实现MapReduce算法的系列。 这次,我们将从文本语料库创建单词共现矩阵。 本系列以前的文章是: 使用MapReduce进行数据密集型文本处理 使用MapReduce进行数据密集型文本处理-本地聚合第二部分 共…

HTML5 拖放、交换位置

设置元素为可拖放 draggable 属性设置为 true: <img draggable"true" /> 拖动什么 - ondragstart 和 setData() dataTransfer.setData() 方法设置被拖数据的数据类型和值: function drag(e) { e.dataTransfer.setData("text/html", value); }注&…

java 工作6年 面试_为什么不想搞Java了,6年经验去面试5分钟结束,现在Java面试为何这么难...

3、Java并发什么是可重入锁、乐观锁、悲观锁、公平锁、非公平锁、独占锁、共享锁&#xff1f;讲讲ThreadLocal 的实现原理&#xff1f;ThreadLocal 作为变量的线程隔离方式&#xff0c;其内部是如何做的&#xff1f;说说InheritableThreadLocal 的实现原理&#xff1f;并发包中…

mvc如何嵌套第三方页面_长文观点丨为什么我不再使用MVC框架?

原创&#xff1a; 张卫滨 译 Jean-Jacques Dubray是一名资深工程师&#xff0c;他最近引入了一个新的模式&#xff1a;状态-行为-模(State-Action-Model&#xff0c;SAM)。SAM是一个函数式反应型的编程模式&#xff0c;它致力于简化数据Model和View之间的交互。它究竟有何优点值…

JSON和XML的区别

转载于:https://www.cnblogs.com/mr-wuxiansheng/p/6974239.html

屏幕适配

rem是什么&#xff1f; rem&#xff08;font size of the root element&#xff09;是指相对于根元素的字体大小的单位。简单的说它就是一个相对单位。看到rem大家一定会想起em单位&#xff0c;em&#xff08;font size of the element&#xff09;是指相对于父元素的字体大小…

【存储过程】MySQL存储过程/存储过程与自定义函数的区别

---------------------------存储过程-------------------- 语法: 创建存储过程: CREATE [definer {user|current_user}] PROCEDURE sp_name ([ proc_parameter [,proc_parameter ...]]) [ characteristics..] routime_body 其中: proc_parameter : [IN|OUT|INOUT] parameter_…

Java死锁故障排除和解决

JavaOne年度会议的一大优点是&#xff0c;主题专家介绍了几个技术和故障排除实验室。 其中的一个实验室今年特别吸引了我的注意力&#xff1a;“ HOL6500-查找和解决Java死锁 ”&#xff0c;由Java冠军Heinz Kabutz提出 。 这是我在该主题上看到的最好的演示之一。 我建议您自己…

java.util.scanner sc_关于Java的Scanner的问题,菜鸟求各大神解答

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼package leetcode;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.Map.Entry;import java.util.…

3. HTML中的容器标签

什么是容器标签&#xff1f;在HTML开发中我们常常会使用一类标签作为容器放置一些内容&#xff0c;我们把这类标签称之为容器标签&#xff0c;可以作为容器标签的包括列表标签、表格标签、框架标签、布局标签&#xff0c;在这里我们就来总结下这些内容。 列表标签 1 <!-- 无…

python自带sqlite库_Python标准库之sqlite3使用实例

Python自带一个轻量级的关系型数据库SQLite。这一数据库使用SQL语言。SQLite作为后端数据库&#xff0c;可以搭配Python建网站&#xff0c;或者制作有数据存储需求的工具。SQLite还在其它领域有广泛的应用&#xff0c;比如HTML5和移动端。Python标准库中的sqlite3提供该数据库的…

GitHub上Java的Bloom Bloom实现

布隆过滤器是集数据结构的一种 。 对于那些不了解的对象&#xff0c;“设置数据结构”仅包含一个主要方法。 它仅用于确定特定元素是否包含在一组元素中。 大多数数据结构&#xff08;例如Hash Map &#xff0c; Linked List或Array &#xff09;都可以相当轻松地创建此函数。 …

Hibernate(十五):QBC检索、本地SQL检索和HQL删除

QBC检索QBC查询就是通过使用Hibernate提供的Query By Criteria API来查询对象&#xff0c;这种API封装了SQL语句的动态拼装&#xff0c;对查询提供了更加面向对象的功能接口。 1&#xff09;通过Critera实现具有条件的查询 1 Test2 public void testCriteria00() {3 …

java 创建连接池失败_java-Presto JDBC连接池创建错误“不支持禁用...

我正在尝试使用Spring-JDBC连接到Presto,并且我正在使用Hikari CP作为数据源.这是我的配置&#xff1a;Beanpublic DataSource myDataSource() {HikariDataSource hikariDataSource new HikariDataSource();hikariDataSource.setDriverClassName("com.facebook.presto.jd…

ni软件管理器_NI 技术支持丨我的 NI 硬件设备不能被识别,怎么办?Windows

这篇指南可以帮助您解决在您的 Windows 系统上无法识别您的 NI 硬件有关的问题。症状包括以下几种情况&#xff1a;连接至 USB 端口时&#xff0c;硬件上的 LED 灯不亮/不闪烁。连接至 USB 后已连接设备的 LED 灯持续闪烁。仅限音频接口&#xff1a;该设备在音频应用程序或 Win…