November 5, 2021

JAVA 正则表达式

JAVA 正则表达式

正则表达式用作字符串的搜索模式。使用正则表达式,我们也可以找到单个匹配项或多个匹配项。我们可以在字符串中查找任何最大匹配项,例如简单的字符、固定字符串或任何复杂的字符模式,如电子邮件、SSN 或域名。

正则表达式

正则表达式是强大、灵活和高效的文本处理的关键。它允许您描述和解析文本。正则表达式可以添加、删除、隔离,通常折叠、主轴和残害各种文本和数据。

元字符和文字

全正则表达式由两种类型的字符组成。

正则表达式从其元字符提供的高级表达能力中非常有用。我们可以把字面文本视为单词,将元字符视为语法。这些单词根据一套规则与语法相结合,以创建一个传达想法的表达式。

正则表达式元字符

让我们探索常用的元字符,以更好地理解它们。

开始和结束

开头和结尾用 ^$ 符号表示。插入符号和美元很特别,因为它们与行中的位置匹配,而不是任何实际文本字符本身。

例如,正则表达式 cat 在字符串的任何地方找到 cat,但只有当 cat 位于行的开头时,^cat 才会匹配,例如类别目录等单词。

同样,只有当 cat 在行末尾时,cat 才会匹配,例如像 cat 这样的单词。

字符类

正则表达式构造 ··· 通常称为字符类,允许我们在比赛的那个时候列出我们想要允许的字符。字符类在创建拼写检查器方面非常有用。

例如,e 只匹配 ea 只匹配 a,但正则表达式 ea 均匹配。例如,sep[ea]r[ea]te 将匹配所有 seperateseparateseparete

另一个例子可以是允许单词的第一个字母大写,例如 [Ss]mith 会允许 smithSmith 这两个词。

同样,<[hH][123456]> 将匹配所有标题标签,即 H1、H2、H3、H4、H5 和 H6。

字符范围

破折号 “ - “ 表示一系列字符。<[hH][1-6]> 类似于 <[hH][123456]>。其他有用的字符范围是 [0-9] 和 [a-z],它们匹配数字和英语小写字母。

我们可以在单个构造中指定多个范围,例如 [0123456789abcdefABCDEF] 可以写成 [0-9a-fA-F]。请注意,给出范围的顺序无关紧要。

请注意,破折号仅在字符类中是一个元字符,否则它与普通破折号字符匹配。此外,如果它是范围中列出的第一个字符,它可能无法指示范围,因此在这种情况下,它不会是元字符。

被否定的字符类

如果我们在字符类中使用否定符号 ( ^ ) 则该类匹配未列出的任何字符。例如 [^1-6] 匹配非 1 到 6 的字符。

将任何字符与点匹配

元字符 . 是匹配任何字符的字符类的缩写。请注意,当点在字符类中使用时,它们不是元字符。在字符类中,它只是一个简单的字符。

例如,06.24.2019 将与 06/24/2019 或 06-24-2019 或 201906.24.2019 相匹配。但是 06[.]24[.]2019 仅匹配 06.24.2019。

匹配交替 – 几个子表达式中的任何一个

管道符号 | 允许您将多个表达式组合成一个与任何单个表达式匹配的表达式。

例如,AlexBrian 是单独的表达式,但 Alex|Brian 是两者中任何一个匹配的表达式。

与点类似,管道在字符类中使用时不是元字符。在字符类中,它只是一个简单的字符。

例如,为了匹配 First1st 这两个词,我们可以写正则表达式——(First|1st)或速记 (Fir|1)st

正则表达式语法

预定义字符类

. 任何字符(与行结束符可能匹配可能不匹配)
\d 数字[0-9]
\D 非数字[^0-9]
\s 空白字符[\t\n\f\r]
\w 单词字符[a-zA-Z_0-9]
\W 非单词字符[^\w]

Greedy 数量词

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] 任何字符,除了a、b或c(否定)
[a-zA-Z] a到z 或 A-Z,两头字母包括在内(范围)
[a-d[m-p]] a到d 或 m到p :a-dm-p
[a-z&&[def]] d、e或f(交集)

边界匹配器

^ 行的开头
$ 行的结尾
\b 单词的边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符(如果有的话)
\z 输入的结尾

实例

电子邮件地址的正则表达式

1
^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$

密码验证的正则表达式

1
((?=.*[a-z])(?=.*d)(?=。*[@#$%])(?=。*[A-Z])。{6,16})

商标符号的正则表达式

1
\u2122

任何货币符号的正则表达式

1
\\p{Sc}

“希腊扩展”或希腊字母中任何字符的正则表达式

1
\\p{InGreek}和\\p{InGreekExtended}

北美电话号码的正则表达式

1
^\\(?([0-9]{3})\\)?[-.\\s]?([0-9]{3})[-.\\s]?([0-9]{4})$

国际电话号码的正则表达式

1
^\+(?:[0-9]?){6,14}[0-9]$

日期格式的正则表达式

1
^[0-3]?[0-9]/[0-3]?[0-9]/(?:[0-9]{2})?[0-9]{2}美元

社会保障号码(SSN)的正则表达式

1
^(?!000|666)[0-8][0-9]{2}-(?!00)[0-9]{2}-(?!0000)[0-9]{4}$

国际标准书号(ISBN)的正则表达式

1
^(?:ISBN(?:-1[03])?:?)?(?=[0-9X]{10}$|(?=(?:[0-9]+[- ]){3})[- 0-9X]{13}$|97[89][0-9]{10}$|(?=(?:[0-9]+[-]){4})[- 0-9]{17}$)(?:97[89][- ]?)?[0-9]{1,5}[-]?[0-9]+[-]?[0-9]+[-]?[0-9X]$

About this Post

This post is written by OwlllOvO, licensed under CC BY-NC 4.0.

#JAVA#Regex