正则表达式

简介: 正则表达式, 又称正规表示式、 正规表示法、 正规表达式、 规则表达式、 常规表示法(英语: Regular Expression, 在代码中常简写为regex、 regexp或RE) , 是计算机科学的一个概念。

正则表达式, 又称正规表示式、 正规表示法、 正规表达式、 规则表达式、 常规表示法(英语: Regular Expression, 在代码中常简写为regex、 regexp或RE) , 是计算机科学的一个概念。 正则表达式使用单个字符串来描述、 匹配一系列匹配某个句法规则的字符串。 在很多⽂本编辑器⾥, 正则表达式通常被用来检索、 替换那些匹配某个模式的文本。


1.1 句点符号

假设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以“t”字母开头,以“n”字母结束。另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内容。要构造出这个正则表达式,你可以使用一个通配符——句点符号“.”。这样,完整的表达式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,还匹配“t#n”、“tpn”甚至“t n”,还有其他许多无意义的组合。这是因为句点符号匹配所有字符,包括空格、Tab字符甚至换行符:

1.2 方括号符号

为了解决句点符号匹配范围过于广泛这一问题,你可以在方括号(“[]”)里面指定看来有意义的字符。此时,只有方括号里面指定的字符才参与匹配。也就是说,正则表达式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。但“Toon”不匹配,因为在方括号之内你只能匹配单个字符:

1.3 “或”符号

如果除了上面匹配的所有单词之外,你还想要匹配“toon”,那么,你可以使用“|”操作符。“|”操作符的基本意义就是“或”运算。要匹配“toon”,使用“t(a|e|i|o|oo)n”正则表达式。这里不能使用方扩号,因为方括号只允许匹配单个字符;这里必须使用圆括号“()”。圆括号还可以用来分组,具体请参见后面介绍。

20180730181910891.png

1.4 表示匹配次数的符号

20180730182258729.png

假设我们要在文本文件中搜索美国的社会安全号码。这个号码的格式是999-99-9999。用来匹配它的正则表达式如图一所示。在正则表达式中,连字符(“-”)有着特殊的意义,它表示一个范围,比如从0到9。因此,匹配社会安全号码中的连字符号时,它的前面要加上一个转义字符“\”。



假如你需要匹配⽂本中的字符"\", 那么使⽤编程语⾔表示的正则表达式将需要4个反斜杠"\\": 前两个和后两个分别用于在编程语言里转义成反斜杠, 转换成两个反斜杠后再在正则表达式⾥转义成一个反斜杠。


假设进行搜索的时候,你希望连字符号可以出现,也可以不出现——即,999-99-9999和999999999都属于正确的格式。这时,你可以在连字符号后面加上“?”数量限定符号


下面我们再来看另外一个例子。美国汽车牌照的一种格式是四个数字加上二个字母。它的正则表达式前面是数字部分“[0-9]{4}”,再加上字母部分“[A-Z]{2}”。图三显示了完整的正则表达式。

1.5 “否”符号


“^”符号称为“否”符号。如果用在方括号内,“^”表示不想要匹配的字符。例如,图四的正则表达式匹配所有单词,但以“X”字母开头的单词除外。

20180730182642617.png

2018073018284166.png

name:<></>的匹配形式

20180730182819975.png

手机号的正则表达:


//移动号码段:139、138、137、136、135、134、150、151、152、157、158、159、182、183、187、188、147


* 联通号码段:130、131、132、136、185、186、145


* 电信号码段:133、153、180、189


//


String regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\d{8}$";


验证固话号码:


String regex = "^(0\\d{2}-\\d{8}(-\\d{1,4})?)|(0\\d{3}-\\d{7,8}(-\\d{1,4})?)$";



完整版:



Java 正则表达式


正则表达式定义了字符串的模式。

正则表达式可以用来搜索、编辑或处理文本。

正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。


正则表达式实例


一个字符串其实就是一个简单的正则表达式,例如 Hello World 正则表达式匹配 "Hello World" 字符串。

.(点号)也是一个正则表达式,它匹配任何一个字符如:"a" 或 "1"。


下表列出了一些正则表达式的实例及描述:

微信图片_20211203010607.png

Java 正则表达式和 Perl 的是最为相似的。


java.util.regex 包主要包括以下三个类:


Pattern 类:

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


Matcher 类:

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


PatternSyntaxException:

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

以下实例中使用了正则表达式 .*runoob.* 用于查找字符串中是否包了 runoob 子串:

微信图片_20211203010646.png

字符串中是否包含了 'jb51' 子字符串? true


捕获组


捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建。

例如,正则表达式 (dog) 创建了单一分组,组里包含"d","o",和"g"。

捕获组是通过从左至右计算其开括号来编号。例如,在表达式((A)(B(C))),有四个这样的组:


((A)(B(C)))

(A)

(B(C))

(C)


可以通过调用 matcher 对象的 groupCount 方法来查看表达式有多少个分组。groupCount 方法返回一个 int 值,表示matcher对象当前有多个捕获组。

还有一个特殊的组(group(0)),它总是代表整个表达式。该组不包括在 groupCount 的返回值中。


实例


下面的例子说明如何从一个给定的字符串中找到数字串:


RegexMatches.java 文件代码:

3KT(FJVENORTHP2[[Q1A}FK.png

以上实例编译运行结果如下:


Found value: This order was placed for QT3000! OK?

Found value: This order was placed for QT

Found value: 3000

Found value: ! OK?


正则表达式语法


在其他语言中,\\ 表示:我想要在正则表达式中插入一个普通的(字面上的)反斜杠,请不要给它任何特殊的意义。

在 Java 中,\\ 表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。

所以,在其他的语言中,一个反斜杠\就足以具有转义的作用,而在正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在正则表达式中,两个 \ 代表其他语言中的一个 \,这也就是为什么表示一位数字的正则表达式是 \\d,而表示一个普通的反斜杠是 \\\\。

QQ图片20211203011209.png

根据 Java Language Specification 的要求,Java 源代码的字符串中的反斜线被解释为 Unicode 转义或其他字符转义。因此必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被 Java 字节码编译器解释。例如,当解释为正则表达式时,字符串字面值 "\b" 与单个退格字符匹配,而 "\\b" 与单词边界匹配。字符串字面值 "hellohello" 是非法的,将导致编译时错误;要与字符串 (hello) 匹配,必须使用字符串字面值 \\(hello\\)。


Matcher 类的方法

索引方法

索引方法提供了有用的索引值,精确表明输入字符串中在哪能找到匹配:

QQ图片20211203011308.png

研究方法

研究方法用来检查输入字符串并返回一个布尔值,表示是否找到该模式:

QQ图片20211203011349.png

替换方法

替换方法是替换输入字符串里文本的方法:

 QQ图片20211203011421.png

start 和 end 方法

下面是一个对单词 "cat" 出现在输入字符串中出现次数进行计数的例子:

RegexMatches.java 文件代码:

?


 QQ图片20211203011546.png

以上实例编译运行结果如下:


Match number 1

start(): 0

end(): 3

Match number 2

start(): 4

end(): 7

Match number 3

start(): 8

end(): 11

Match number 4

start(): 19

end(): 22


可以看到这个例子是使用单词边界,以确保字母 "c" "a" "t" 并非仅是一个较长的词的子串。它也提供了一些关于输入字符串中匹配发生位置的有用信息。


Start 方法返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引,end 方法最后一个匹配字符的索引加 1。


matches 和 lookingAt 方法


matches 和 lookingAt 方法都用来尝试匹配一个输入序列模式。它们的不同是 matches 要求整个序列都匹配,而lookingAt 不要求。

lookingAt 方法虽然不需要整句都匹配,但是需要从第一个字符开始匹配。

这两个方法经常在输入字符串的开始使用。


我们通过下面这个例子,来解释这个功能:


RegexMatches.java 文件代码:


?

QQ图片20211203011656.png

以上实例编译运行结果如下:


Current REGEX is: foo

Current INPUT is: fooooooooooooooooo

Current INPUT2 is: ooooofoooooooooooo

lookingAt(): true

matches(): false

lookingAt(): false


replaceFirst 和 replaceAll 方法

replaceFirst 和 replaceAll 方法用来替换匹配正则表达式的文本。不同的是,replaceFirst 替换首次匹配,replaceAll 替换所有匹配。


下面的例子来解释这个功能:


RegexMatches.java 文件代码:

QQ图片20211203013443.png

以上实例编译运行结果如下:


The cat says meow. All cats say meow.


appendReplacement 和 appendTail 方法

Matcher 类也提供了appendReplacement 和 appendTail 方法用于文本替换:

看下面的例子来解释这个功能:


RegexMatches.java 文件代码:

QQ图片20211203013527.png

以上实例编译运行结果如下:


-foo-foo-foo-


PatternSyntaxException 类的方法

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

PatternSyntaxException 类提供了下面的方法来帮助我们查看发生了什么错误。



//

QQ图片20211203013603.png

Java正则表达式的语法与示例

1、匹配验证-验证Email是否正确

QQ图片20211203013640.png

2、在字符串中查询字符或者字符串

QQ图片20211203013712.png

3、常用正则表达式

QQ图片20211203013740.png


更多java 正则表达式的实例可以参考下面这篇文章

//www.jb51.net/article/31251.htm


相关文章
|
3月前
|
自然语言处理 JavaScript 前端开发
正则表达式完整指南(上)
正则表达式完整指南(上)
|
12天前
正则表达式
这是正则表达式的符号概览:^表示行首,$表示行尾,\A和\z分别代表字符串开始和结束。&quot;.&quot;匹配任何字符,\s是空白字符,\S是非空白字符,\d代表数字,\D是非数字,\w是单词字符,\W相反,\b表示单词边界。;选项i忽略大小写,m使&quot;.&quot;匹配换行,x忽略空格,o限制替换次数。
23 7
|
10月前
|
人工智能 数据安全/隐私保护
一些常用的正则表达式
今天在写一些输入验证的时候用到了正则表达式,现在就回顾一下我们常用的正则表达式,对于正则表达式的写法很多种,看个人的习惯了,我的写法也许不是很好,但可以满足基本需求。
81 0
|
11月前
|
前端开发 数据安全/隐私保护 Windows
常用的20个正则表达式
常用的20个正则表达式
242 0
|
11月前
最全面的常用正则表达式大全
最全面的常用正则表达式大全
102 0
|
前端开发 数据安全/隐私保护 Windows
常用正则表达式
开发中经常使用的正则表达式
117 0
|
数据采集 机器学习/深度学习 移动开发
我学会了,正则表达式
爬虫是**非常的**的强大,相信不少朋友都有所耳闻,它帮助我们更快地“获得”我们所要关键数据。那么,它怎么知道我们要需要什么内容?它又是如何工作的?在这篇文章里,我们一起来看看。
76 0
我学会了,正则表达式
|
Java 数据安全/隐私保护
浅谈正则表达式的使用
在开发中,正则表达式的使用场景是多种多样的,同时也能够支持各种复杂场景,同时,正则表达式也是支持许多种语言,对于字符串的截取,匹配,替换 有着巨大的作用。
217 0
|
机器学习/深度学习 C# Windows

热门文章

最新文章