JAVA 正则表达式
正则表达式用作字符串的搜索模式。使用正则表达式,我们也可以找到单个匹配项或多个匹配项。我们可以在字符串中查找任何最大匹配项,例如简单的字符、固定字符串或任何复杂的字符模式,如电子邮件、SSN 或域名。
正则表达式
正则表达式是强大、灵活和高效的文本处理的关键。它允许您描述和解析文本。正则表达式可以添加、删除、隔离,通常折叠、主轴和残害各种文本和数据。
元字符和文字
全正则表达式由两种类型的字符组成。
- 特殊字符(如文件名类比中的 *)称为元字符。
- 其余称为文本字符或普通文本字符。
正则表达式从其元字符提供的高级表达能力中非常有用。我们可以把字面文本视为单词,将元字符视为语法。这些单词根据一套规则与语法相结合,以创建一个传达想法的表达式。
正则表达式元字符
让我们探索常用的元字符,以更好地理解它们。
开始和结束
开头和结尾用 ^
和 $
符号表示。插入符号和美元很特别,因为它们与行中的位置匹配,而不是任何实际文本字符本身。
例如,正则表达式 cat
在字符串的任何地方找到 cat
,但只有当 cat
位于行的开头时,^cat
才会匹配,例如类别
或目录
等单词。
同样,只有当 cat
在行末尾时,cat
才会匹配,例如像 cat
这样的单词。
字符类
正则表达式构造 ···
通常称为字符类,允许我们在比赛的那个时候列出我们想要允许的字符。字符类在创建拼写检查器方面非常有用。
例如,e
只匹配 e
,a
只匹配 a
,但正则表达式 ea
均匹配。例如,sep[ea]r[ea]te
将匹配所有 seperate
、separate
和 separete
。
另一个例子可以是允许单词的第一个字母大写,例如 [Ss]mith
会允许 smith
和 Smith
这两个词。
同样,<[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。
匹配交替 – 几个子表达式中的任何一个
管道符号 |
允许您将多个表达式组合成一个与任何单个表达式匹配的表达式。
例如,Alex
和 Brian
是单独的表达式,但 Alex|Brian
是两者中任何一个匹配的表达式。
与点类似,管道在字符类中使用时不是元字符。在字符类中,它只是一个简单的字符。
例如,为了匹配 First
或 1st
这两个词,我们可以写正则表达式——(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.