正则表达式 - 匹配规则 基本模式匹配
一切从基础开始。 模式是正则表达式最基本的元素。 它们是描述字符串特征的一组字符。 模式可以很简单,由普通字符串组成,也可以非常复杂,通常使用特殊字符来表示一系列字符、重复或表示上下文。 例如:
^once
该模式包含一个特殊字符^,表示该模式仅匹配以once开头的字符串。 例如,此模式匹配字符串“once Upon a time”,但不匹配“There Once was a man from”。 正如 ^ 符号指示开头一样,$ 符号匹配以给定模式结尾的字符串。
bucket$
此模式匹配“谁将所有现金存放在“但不是”中”。 字符 ^ 和 $ 一起使用时表示完全匹配(字符串与模式相同)。 例如:
^bucket$
仅匹配字符串“”。 如果模式不包含 ^ 和 $,则它匹配包含该模式的任何字符串。 例如模式:
once
带绳子
There once was a man from NewYork Who kept all of his cash in a bucket.
正在匹配。
此模式中的字母(一次)是文字字符,也就是说,它们代表字母本身,数字也是如此。 其他一些稍微复杂的字符,例如标点符号和白色字符(空格、制表符等),需要转义序列。 所有转义序列均以反斜杠 \ 开头。 制表符的转义序列是 \t。 因此,如果我们想检查字符串是否以制表符开头,我们可以使用以下模式:
^\t
同样,用\n表示“换行”,用\r表示回车。 可以使用其他特殊符号,前面加一个反斜杠。 例如,反斜杠本身由 \\ 表示,句点由 \. 表示,等等。
字符簇
在程序中,经常使用正则表达式来验证用户输入。 当用户提交FORM时,使用普通文字字符来确定输入的电话号码、地址、电子邮件地址、信用卡号等是否有效是不够的。
所以我们需要用一种更自由的方式来描述我们想要的模式,这就是字符簇。 要创建代表所有元音字符的簇,请将所有元音字符放在方括号中:
[AaEeIiOoUu]
此模式匹配任何元音字符,但只能表示一个字符。 使用连字符表示一系列字符,例如:
[a-z] // 匹配所有的小写字母 [A-Z] // 匹配所有的大写字母 [a-zA-Z] // 匹配所有的字母 [0-9] // 匹配所有的数字 [0-9\.\-] // 匹配所有的数字,句号和减号 [ \f\r\t\n] // 匹配所有的白字符
再说一次,这些只代表一个角色,而且是一个非常重要的角色。 如果要匹配由小写字母和数字组成的字符串,例如“z2”、“t6”或“g7”,但不匹配“ab2”、“r2d3”或“b52”,请使用以下模式:
^[a-z][0-9]$
虽然[az]代表26个字母的范围,但这里它只能匹配第一个字符是小写字母的字符串。
前面提到^代表字符串的开头,但它还有另外的含义。 当 ^ 用在方括号内时,表示“不”或“排除”,通常用于消除某个字符。 使用前面的示例,我们要求第一个字符不能是数字:
^[^0-9][0-9]$
此模式匹配“&5”、“g7”和“-2”,但不匹配“12”或“66”。 以下是排除特定字符的一些示例:
[^a-z] //除了小写字母以外的所有字符 [^\\\/\^] //除了(\)(/)(^)之外的所有字符 [^\"\'] //除了双引号(")和单引号(')之外的所有字符
正则表达式中使用特殊字符(点、句点)来表示除“换行符”之外的所有字符。 因此,模式 ^.5$ 匹配任何以数字 5 结尾并以其他非“换行”字符开头的两字符字符串。 图案。 可以匹配除换行符(\n、\r)之外的任何字符串。
PHP的正则表达式有一些内置的通用字符簇,列表如下:
字符簇描述
[[:α:]]
任何字母
[[:数字:]]
任何数字
[[:alnum:]]
任何字母和数字
[[:空间:]]
任何空白字符
[[:上:]]
任何大写字母
[[:降低:]]
任何小写字母
[[:标点符号:]]
任何标点符号
[[::]]
任意十六进制数,相当于 [0-9a-fA-F]
确定复发
到目前为止,您已经知道如何匹配字母或数字,但通常情况下,您可能想要匹配一个单词或一组数字。 一个单词由几个字母组成,一组数字由几个单数组成。 字符或字符簇后面的花括号 ({}) 用于确定前面内容的重复次数。
字符簇描述
^[a-zA-Z_]$
所有字母和下划线
^[[:阿尔法:]]{3}$
所有 3 个字母的单词
^a$
字母a
^a{4}$
啊啊啊
^a{2,4}$
aa、aaa 或 aaaa
^a{1,3}$
a、aa 或 aaa
^a{2,}$
包含两个以上 a 的字符串
^a{2,}
如:和aaab,但不是apple
a2,}
如:baad和aaa,但不是
\t{2}
两个标签
.{2}
所有两个字符
这些示例描述了花括号的三种不同用途。 数字{x}表示前面的字符或字符簇仅出现x次; 数字加逗号{x,}表示前面内容出现x次及以上; 以逗号分隔的两个数字{x,y}表示前面的内容至少出现x次,但不超过y次。 我们可以将模式扩展到更多单词或数字:
^[a-zA-Z0-9_]{1,}$ // 所有包含一个以上的字母、数字或下划线的字符串 ^[1-9][0-9]{0,}$ // 所有的正整数 ^\-{0,1}[0-9]{1,}$ // 所有的整数 ^[-]?[0-9]+\.?[0-9]+$ // 所有的浮点数
最后一个例子不太容易理解,是吗? 可以这样想:以可选的减号 ([-]?) (^) 开头,后跟 1 个或多个数字 ([0-9]+),以及小数点 (\.),后跟 1 个或更多数字 ([0-9]+),其后没有其他数字 ($)。 下面您将了解可以使用的更简单的方法。
特殊字符? 等于{0,1},都表示:0或1个前面的内容或者前面的内容是可选的。 所以刚才的例子可以简化为:
^\-?[0-9]{1,}\.?[0-9]{1,}$
特殊字符*等于{0,},它们都代表0个或多个先前的内容。 最后,字符+等于{1,},表示前面的一个或多个内容,所以上面的四个例子可以写成:
^[a-zA-Z0-9_]+$ // 所有包含一个以上的字母、数字或下划线的字符串 ^[1-9][0-9]*$ // 所有的正整数 ^\-?[0-9]+$ // 所有的整数 ^[-]?[0-9]+(\.[0-9]+)?$ // 所有的浮点数
当然,这在技术上并没有降低正则表达式的复杂性,但它使它们更易于阅读。