Java正则表达式简介及实例

Java正则表达式简介及实例何为正则表达式?有时候会需要编写代码来验证用户输入,比如验证输入是否是一个数字,是否是一个全部小写的字符串,或者社会安全号,完成这个任务一个简单高效的方法就是用正则表达式!

大家好,又见面了,我是你们的朋友全栈君。

有时候会需要编写代码来验证用户输入,比如验证输入是否是一个数字,是否是一个全部小写的字符串,或者社会安全号,完成这个任务一个简单高效的方法就是用正则表达式!

  • 介绍

正则表达式(regular expression,简写为regex)是一个字符串,用来描述匹配一个字符串集合的模式。

java.util.regex 包实现正则表达式主要包括以下三个类:

  • Pattern 类:

    pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。

  • Matcher 类:

    Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。

  • PatternSyntaxException:

    PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。

  • 匹配字符串

先从String的matches方法开始,matches方法很类似equals方法。但它不仅可以匹配固定字符串,还可以匹配一个模式的字符串集,例如,以下语句结果均为true。

“Java is fun”.matches(“Java.*”)
“Java is cool”.matches(“Java.*”)
“Java is powful”.matches(“Java.*”)

前面语句中的“Java.*”是一个正则表达式,它描述了一个字符串模式,以Java开始,后面跟0或者多个字符串。这里,字符串.*匹配任何0或多个字符。

  • 正则表达式语法

正则表达式由字面值字符和特殊符号组成。

注:反斜杠是一个特殊的字符,在字符串中开始转义序列。因此Java中需要使用\\来表示\。在其他的语言中(如 Perl),一个反斜杠 \ 就足以具有转义的作用,而在 Java 中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在 Java 的正则表达式中,两个 \\ 代表其他语言中的一个 \,这也就是为什么表示一位数字的正则表达式是 \\d,而表示一个普通的反斜杠是 \\。如下:

System.out.print("\\");    // 输出为 \
System.out.print("\\\\");  // 输出为 \\

       空白字符是’ ‘、’\t’、’\n\、’\r’,或者’\f’。因此,\s和[\t\n\r\f]等同,\S和[^\t\n\r\f]等同。

以下为常用的正则表达式:

Java正则表达式简介及实例

注:单词字符是任何的字母,数字或者下划线字符。因此\w等同于[a-z[A-Z][0-9]_]或者简化为[a-Za-z0-9_]。\w等同于[^a-Za-z0-9].

       上表中后面六个条目*、+、?、{n}、{n,}以及{n,m}称为两次符(quantifier),用于确定量次符前面的模式会重复多少次。例如:A*匹配0或者多个A,A+匹配1或者多个A,A?匹配0或者1个A。A{3}精确匹配AAA,A{3,}不能写成逗号后面有一个空白符的A{3,6}。

       不要在重复量词符中使用空白。例如,A{3,6}不能写成逗号后面有一个空白符的A{3, 6}

       可以使用括号来讲模式进行分组。例如,(ab){3}匹配ababab,但是ab{3}匹配abbb。

  • 构建正则表达式示例

  • 示例1

社会安全号的模式是xxx-xx-xxx,其中x是一位数字。社会安全号的正则表达式可以描述为

[\\d]{3}-[\\d]{2}-[\\d]{4}

例如

“111-22-3333”.matches(“[\\d]{3}-[\\d]{2}-[\\d]{4}”) return true

“11-22-3333”.matches(“[\\d]{3}-[\\d]{2}-[\\d]{4}”) return false

  • 示例2

电话号码的模式是(xxx)xxx-xxxx,这里x是一位数字,并且第一位数字不能为0.电话号码的正则表达式可以描述为

\\([1-9][\\d]{2})[\\d]{3}-[\\d]{4}

注:括符(和)在正则表达式中是特殊字符,用于对模式分组。为了在正则表达式中表示字面值(或者),必须使用\\(和\\)。

例如

“(912)921-2728”.matches(“\\ ([1-9][\\d]{2}\\)[\\d]{3}-[\\d]{4}”)  return true.

“912-2728”.matches(“\\ ([1-9][\\d]{2}\\) [\\d]{3}-[\\d]{3}-[\\d]{4}”)  return false.

  • 示例3

假定姓由最多25个字母组成,并且第一个字母为大写形式。则姓的模式可以描述为[A-Z][a-zA-Z]{1,24}

注:不能随便放空白符到正则表达式中。如[A-Z][a-zA-Z]{1, 24}将报错。例如:

“Smith”.matches(“[A-Z][a-zA-Z]{1,24}  return true.

“Jones123”.matches(“[A-Z][a-zA-Z]{1,24}  return false.

  • 示例4

Java标识符有如下要求

  • 标识符必须以字母、下划线(_),或者美元符号($)开始。不能以数字开头。
  • 标识符是一个由字母、数字、下划线(_)和美元符号组成的字符序列。

标识符的模式可以描述为

[a-zA-Z_$][\\w$]*

  • 示例5

什么字符串匹配正则表达式”Welcome to (Java|HTML)”?答案是Welcome to Java或者Welcome to HTML。

什么字符串匹配正则表达式”.*”?答案是任何字符串。

  • 替换和拆分字符串

如果字符串匹配正则表达式,String类的matches方法返回true。String类也包含repalceAll、replaceFirst和split方法,用于替换和拆分字符串,如下图。

Java正则表达式简介及实例

 replaceAll方法替换所有匹配的子字符串,replaceFirst方法替换第一个匹配的子字符串。例如,下面代码

System.out.println(“Java Java Java”.replaceAll(“v\\w”,”wi”));

显示

Jawi Jawi Jawi

下面代码

System.out.println(“Java Java Java”.replaceFirst(“v\\w”,”wi”));

显示

Jawi Java Java

有两个重载split方法。split(regex)方法使用匹配的分隔符将一个字符串拆分成为子字符串。例如,以下语句

String[] tokens=”Java1HTML2perl”.split(“\\d”);

将字符串拆分为Java、HTML以及Perl并且保存在tokens[0],tokens[1]以及tokens[2]中。

在split(regex,limit)方法中,limit参数确定模式匹配多少次。如果limit<=0,split(regex,limit)等同与split(regex)。如果limit>=0,模式最多匹配limit-1次。如以下示例:

“Java1HTML2perl”.split(“\\d”,0);拆分为Java,HTML,Perl

“Java1HTML2perl”.split(“\\d”,1);拆分为JavaHTMLPerl

“Java1HTML2perl”.split(“\\d”,2);拆分为Java,HTMLPerl

“Java1HTML2perl”.split(“\\d”,3);拆分为Java,HTML,Perl

“Java1HTML2perl”.split(“\\d”,4);拆分为Java,HTML,Perl

“Java1HTML2perl”.split(“\\d”,5);拆分为Java,HTML,Perl

注:默认情况下,所有的量词字符都是”贪婪“的.这意味着它们会尽可能匹配最多次。比如,下面语句显示JRvaa。因为第一个匹配成功的是aaa。

System.out.println(“Jaaavaa”.replaceFirst(“a+”,”R”));

可以通过在后面添加问号(?)来改变量词符的默认行为。量词符变为”不情愿“或者”惰性“的,这意味着它将匹配尽可能少的次数。例如,下面的语句显示JRaavaa,因为第一个匹配成功的是a。

System.out.println(“Jaaavaa”.replaceFirst(“a+?”,”R”));

以上总结参考于

Java语言程序设计与数据结构  基础篇  Comprehensive version_(美)梁勇(Y. Daniel Liang)

感兴趣的小伙伴可以买来深入学习更多关于Java欧!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/161624.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • window下phpstudy的nginx配置虚拟主机

    window下phpstudy的nginx配置虚拟主机

    2021年10月15日
  • P1983 [NOIP2013] 车站分级(拓扑排序)[通俗易懂]

    P1983 [NOIP2013] 车站分级(拓扑排序)[通俗易懂]原题链接题目描述一条单向的铁路线上,依次有编号为 1, 2, …, n1,2,…,n的 nn个火车站。每个火车站都有一个级别,最低为 11 级。现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车站 xx,则始发站、终点站之间所有级别大于等于火车站xx 的都必须停靠。(注意:起始站和终点站自然也算作事先已知需要停靠的站点)例如,下表是55趟车次的运行情况。其中,前44 趟车次均满足要求,而第 55 趟车次由于停靠了 33 号火车站(22 级)却未停靠途经的 66 号火车站(亦为

  • BZOJ5305 [Haoi2018]苹果树

    BZOJ5305 [Haoi2018]苹果树

  • 最小二乘法推导以及理解[通俗易懂]

    最小二乘法推导以及理解[通俗易懂]我在网上发现了两种推导方式,于是自己跟着推导了一遍。。。。。(一)(高数式推导): [参考博客](https://blog.csdn.net/MarsJohn/article/details/54911788) 这里先引入两个提前推得出的结论: ![两个结论](https://img-blog.csdnimg.cn/20190907195440348.jpg?x-oss-proce…

  • kotlin 使用viewStub

    kotlin 使用viewStubViewStub是一个轻量级的的View,继承于ViewGroup,没有任何尺寸,不绘制任何东西,因此绘制或者移除时更省时。(ViewStub不可见,大小为0)优点实现View的延迟加载,避免资源的浪费,减少渲染时间,在需要的时候才加载View缺点ViewStub所要替代的layout文件中不能有标签 ViewStub在加载完后会被移除,或者说是被加载进来的layout替换掉了…

  • synchronized偏向锁和轻量级锁_偏向锁/轻量级锁/重量级锁的原理

    synchronized偏向锁和轻量级锁_偏向锁/轻量级锁/重量级锁的原理今天简单了解了一下java轻量级锁和重量级锁以及偏向锁。看了看这篇文章觉得写的不错原文链接java 偏向锁、轻量级锁及重量级锁synchronized原理Java对象头与Monitorjava对象头是实现synchronized的锁对象的基础,synchronized使用的锁对象是存储在Java对象头里的。对象头包含两部分:Mark Word 和 Class Metadata Address其中Mark Word在默认情况下存储着对象的HashCode、分代年龄、锁标记位等以下是32位JVM的

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号