“现在我要告诉你正则表达式。这个话题既复杂又简单。要彻底理解正则表达式,你可能需要阅读两三本厚书,但我可以教你如何使用它们现在。”
“正如有经验的程序员喜欢开玩笑的那样,如果你遇到问题并认为你会用正则表达式解决它,那么现在你有两个问题。”
“唔。”
“我希望我没有吓到你太多,我的朋友。不是吗?”
“好,好。那么,我们的新课题就是正则表达式了。”
“如果我们过度简化它们,正则表达式就是字符串的模式。”
“您可以检查字符串是否与给定模式匹配。您还可以使用定界符或模式将字符串拆分成多个部分。”
“但让我们从简单的事情开始:什么是模式? ”
“在 SQL 中(但不是在 Java 中),您可以检查字符串是否与特定模式匹配。它看起来是这样的:”
name like 'Alex%'
这里的 name 是一个变量,like 是一个检查模式的命令,“Alex%”就是模式。
在这种情况下,% 表示任何字符串或子字符串。
图案 | 匹配模式的字符串 |
---|---|
'亚历克斯%' | 亚历克斯 亚历克斯安德亚历 克斯安德亚历 克斯安德拉 …… |
'%X%' | Max x Ma x im Ale x andr … |
'%A' | Olg和 Helen和 Ir a … |
“在 SQL 中,如果您需要指定只能有一个其他字符,那么您将使用下划线字符:“_”。”
图案 | 匹配模式的字符串 |
---|---|
'亚历克斯%_' | 亚历克斯安德亚历 克斯安德亚历 克斯安德拉 …… |
'_X' | 斧 Bx Cx … |
'___' | 啊啊 啊啊 啊啊 …… |
“这就说得通了。”
“好吧,那么让我们继续学习正则表达式。”
“正则表达式通常不仅包括对字符数量的限制,还包括对字符数量的限制。”任何掩码通常由两部分(有时更多)组成:第一部分描述字符“首选项”,第二部分描述字符数量”
“这里有一些内容示例:”
图案 | 描述 | 例子 |
---|---|---|
. | 任何一个角色 | 1个 |
\d | 任何数字 | 7 |
\D | 任何非数字 | C |
\s | 空格、换行符或制表符 | ' ' |
\S | 除空格、制表符和换行符之外的任何内容 | F |
[阿兹] | 从 a 到 z 的任何字母 | z |
[0-9] | 从 0 到 9 的任何数字。 | 8个 |
\w | 任意字字符 | C |
\W | 任何非单词字符 | _ |
“我不会马上记住那些,但看起来并不难。”
“很好,下面是掩码中字符数的示例: ”
图案 | 描述 | 例子 |
---|---|---|
A? | 字符“A”出现一次或根本不出现 | A |
B+ | 字符“B”出现一次或多次 | BBBB |
C* | 字符“C”出现零次或多次 | CCC 认证 |
D{n} | 字符'D'出现n次 | 模式 D{4} 匹配 DDDD |
E{n,} | 字符“E”出现 n 次或更多次 | 模式 E{2,} 匹配 EEEEEEE |
F{n,m} | 字符“F”出现了 n 到 m 次 | 模式 E{2,4} 匹配 EEEE |
“这一切看起来都很简单。”
“你很快就掌握了一切。现在让我们一起看看它看起来如何:”
图案 | 描述 | 例子 |
---|---|---|
[广告]? | 'a' 和 'd' 之间的字符出现一次或根本不出现 | A B C D |
[bd,z]+ | 字符“b”、“c”、“d”或“z”出现一次或多次 | b, bcdcdbdbdbdbzzzzbbzbzb, zbz |
[1,7-9]* | 数字 1、7、8 或 9 出现零次或多次 | 1, 7, 9, 9777, 111199 |
1{5} | 数字1出现5次 | 11111 |
[1,2,a,b]{2} | 符号 1、2、'a' 或 'b' 出现两次 | 11, 12, 1a, ab, 2b, bb, 22 |
[a,0]{2,3} | 符号“a”或 0 出现 2 或 3 次 | aa, a0,00,0a, aaa,000, a00,0a0, a0a |
“还是很清楚。”
“真的吗?嗯。要么我解释得很好,要么你理解得太快了。好吧,不管怎样,这对我们都有好处。”
“这里有一些新的见解给你。”
“由于正则表达式通常用于查找子字符串,我们可以在我们的模式中再添加两个字符(^ 和 $)。”
"^ 表示子字符串必须包含字符串的开头。"
"$ 表示子字符串必须包括字符串的末尾。"
“这里有些例子:”
图案 | 与模式匹配的字符串和子字符串 |
---|---|
一个{3} | 啊啊 啊啊 啊 _ _ |
一个{3}$ | 啊啊啊啊 啊 |
^a{3} | 啊啊 啊啊啊 |
^一个{3}$ | 啊啊啊啊啊 |
“还有一点很重要。”
“在正则表达式中,以下字符具有特殊含义:[ ] \ / ^ $ . | ? * + ( ) { }。它们被称为控制字符。因此,您不能简单地在字符串中使用它们。”
“就像在 Java 代码中一样,它们必须被转义。”同样,在 Java 代码中,'\' 字符用于此目的。
“如果我们想描述一个由三个'?'组成的字符串 字符,我们不能写'?{3}',因为'?' 是一个控制字符。我们需要这样做:\?{3}。如果我们想使用'\'字符,那么我们需要写'\\'。”
“好的,我知道了。”
“现在还有另一个有趣的花絮。在带有 Java 代码的文件中,'\' 字符也必须在字符串中转义,因为它是一个控制字符。”
“当然。”
“所以,如果你试图在字符串中定义 Java 正则表达式,那么你需要对 '\' 字符进行两次转义。”
“这是一个例子:”
我想要一个匹配 'c:\anything' 的掩码 |
理论上,正则表达式应如下所示: 一个“c”字符、 冒号、 反斜杠、 句点和星号(表示任意数量的字符)。我添加了空格以提高可读性: c : \ .* 但字符 '\' 和 '.' 需要进行转义,因此正则表达式将如下所示: c : \\ \. * 或者,不带空格 c: \\ \. * |
"我们的正则表达式中应该有三个反斜杠。 这意味着在 Java 文件中正则表达式将如下所示:" String regexp = "c: \\\\ \\. *"; |
“哇!哇哦。现在我知道了。”
“如果您决定深入研究,这里有几个很好的链接:”
GO TO FULL VERSION