模式 | 描述 |
---|---|
^ |
匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。 |
$ |
匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。 |
. |
匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式。 |
[...] |
字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。 |
[^...] |
负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’。 |
p1 单竖杠 p2 单竖杠 p3 |
匹配 p1 或 p2 或 p3。例如,‘z 单竖杠 food’ 能匹配 “z” 或 “food”。‘(z 单竖杠 f)ood’ 则匹配 “zood” 或 “food”。 |
* |
匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。 |
+ |
匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。 |
{n} |
n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。 |
{n,m} |
m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 |
^
-- 选择所有以 "John" 开头的名字
SELECT name FROM users WHERE name REGEXP '^John';
-- 选择所有以数字开头的名字
SELECT name FROM users WHERE name REGEXP '^[0-9]';
-- 选择所有以大写字母开头的名字
SELECT name FROM users WHERE name REGEXP '^[A-Z]';
-- 选择所有以 "A" 或 "B" 或 "C" 开头的名字
SELECT name FROM users WHERE name REGEXP '^[ABC]';
-- 选择所有以 "Dr." 开头的名字
SELECT name FROM users WHERE name REGEXP '^Dr\.';
-- 选择所有以 "Mr" 或 "Ms" 开头的名字
SELECT name FROM users WHERE name REGEXP '^(Mr|Ms)';
$
-- 选择所有以 "Smith" 结尾的名字
SELECT name FROM users WHERE name REGEXP 'Smith$';
-- 选择所有以数字结尾的名字
SELECT name FROM users WHERE name REGEXP '[0-9]$';
-- 选择所有以大写字母结尾的名字
SELECT name FROM users WHERE name REGEXP '[A-Z]$';
-- 选择所有以 "." 结尾的名字
SELECT name FROM users WHERE name REGEXP '\\.$';
-- 选择所有以 "Jr" 或 "Sr" 结尾的名字
SELECT name FROM users WHERE name REGEXP '(Jr|Sr)$';
.
-- 选择名字中包含任意两个连续字符的数据
SELECT name FROM users WHERE name REGEXP '..';
-- 选择名字中间有一个点的数据
SELECT name FROM users WHERE name REGEXP '.\\..';
-- 选择名字中有任意三个连续字符的数据
SELECT name FROM users WHERE name REGEXP '...';
-- 选择名字开始和结束都是任意字符,中间是一个空格的数据
SELECT name FROM users WHERE name REGEXP '^.[ ].$';
-- 选择名字中有任意字符后紧跟数字的数据
SELECT name FROM users WHERE name REGEXP '.[0-9]';
-- 选择名字中有数字后紧跟任意字符的数据
SELECT name FROM users WHERE name REGEXP '[0-9].';
[...]
-- 选择名字中包含 a, b 或 c 的数据
SELECT name FROM users WHERE name REGEXP '[abc]';
-- 选择名字中包含数字的数据
SELECT name FROM users WHERE name REGEXP '[0-9]';
-- 选择名字中包含大写字母的数据
SELECT name FROM users WHERE name REGEXP '[A-Z]';
-- 选择名字中包含特定范围内的字符的数据,例如a到f
SELECT name FROM users WHERE name REGEXP '[a-f]';
-- 选择名字中包含特定的字符组合,例如., !, 或 ?
SELECT name FROM users WHERE name REGEXP '[\\.!?]';
[^...]
-- 选择名字中不包含 a, b 或 c 的数据
SELECT name FROM users WHERE name REGEXP '[^abc]';
-- 选择名字中不包含数字的数据
SELECT name FROM users WHERE name REGEXP '[^0-9]';
-- 选择名字中不包含大写字母的数据
SELECT name FROM users WHERE name REGEXP '[^A-Z]';
-- 选择名字中不包含特定范围内的字符的数据,例如a到f
SELECT name FROM users WHERE name REGEXP '[^a-f]';
-- 选择名字中不包含特定的字符组合,例如., !, 或 ?
SELECT name FROM users WHERE name REGEXP '[^\\.!?]';
p1|p2|p3
-- 选择名字为 "John"、"Jane" 或 "Jake" 的数据
SELECT name FROM users WHERE name REGEXP 'John|Jane|Jake';
-- 选择名字中包含 "apple"、"banana" 或 "cherry" 的数据
SELECT name FROM users WHERE name REGEXP 'apple|banana|cherry';
-- 选择名字开始为 "Mr"、"Mrs" 或 "Dr" 的数据
SELECT name FROM users WHERE name REGEXP '^(Mr|Mrs|Dr)';
-- 选择名字结尾为 "Jr"、"Sr" 或 "III" 的数据
SELECT name FROM users WHERE name REGEXP '(Jr|Sr|III)$';
-- 选择名字中包含数字 "123"、"456" 或 "789" 的数据
SELECT name FROM users WHERE name REGEXP '123|456|789';
*
-- 选择名字中包含 "fo" 或 "foo" 或 "fooo" 等的数据
SELECT name FROM users WHERE name REGEXP 'fo*';
-- 选择名字中包含 "a" 或 "aa" 或 "aaa" 等的数据
SELECT name FROM users WHERE name REGEXP 'a*';
-- 选择名字中包含 "z" 或 "zo" 或 "zoo" 等的数据
SELECT name FROM users WHERE name REGEXP 'zo*';
-- 选择名字开始为 "Dr" 后跟任意数量的空格的数据
SELECT name FROM users WHERE name REGEXP '^Dr *';
-- 选择名字中包含数字 "1" 后跟任意数量的 "0",如 "10"、"100"、"1000" 等的数据
SELECT name FROM users WHERE name REGEXP '10*';
+
-- 选择名字中包含 "fo" 或 "foo" 但不包含单个 "f" 的数据
SELECT name FROM users WHERE name REGEXP 'fo+';
-- 选择名字中包含 "a" 或 "aa" 或 "aaa" 等的数据,但至少有一个 "a"
SELECT name FROM users WHERE name REGEXP 'a+';
-- 选择名字中包含 "z" 或 "zo" 或 "zoo" 等的数据,但至少有一个 "o"
SELECT name FROM users WHERE name REGEXP 'zo+';
-- 选择名字开始为 "Dr" 后跟至少一个空格的数据
SELECT name FROM users WHERE name REGEXP '^Dr +';
-- 选择名字中包含数字 "1" 后跟至少一个 "0",如 "10"、"100"、"1000" 等的数据
SELECT name FROM users WHERE name REGEXP '10+';
{n}
-- 选择名字中包含两个连续的 "o" 字符的数据
SELECT name FROM users WHERE name REGEXP 'o{2}';
-- 选择名字中包含三个连续的 "a" 字符的数据
SELECT name FROM users WHERE name REGEXP 'a{3}';
-- 选择名字中包含四个连续的数字的数据
SELECT name FROM users WHERE name REGEXP '[0-9]{4}';
-- 选择名字开始为 "Dr" 后跟两个空格的数据
SELECT name FROM users WHERE name REGEXP '^Dr {2}';
-- 选择名字中包含三个连续的任意字符的数据
SELECT name FROM users WHERE name REGEXP '.{3}';
{n,m}
-- 选择名字中包含至少2次到最多3次的 "o" 字符的数据
SELECT name FROM users WHERE name REGEXP 'o{2,3}';
-- 选择名字中包含至少1次到最多4次的 "a" 字符的数据
SELECT name FROM users WHERE name REGEXP 'a{1,4}';
-- 选择名字中包含至少2次到最多5次的数字的数据
SELECT name FROM users WHERE name REGEXP '[0-9]{2,5}';
-- 选择名字开始为 "Dr" 后跟至少1个到最多3个空格的数据
SELECT name FROM users WHERE name REGEXP '^Dr {1,3}';
-- 选择名字中包含至少2次到最多4次的任意字符的数据
SELECT name FROM users WHERE name REGEXP '.{2,4}';
-- 查找以 "Mr" 或 "Mrs" 开头,后跟一到两个空格,然后是以 "Smith" 或 "Jones" 结尾的名字。
SELECT name FROM users WHERE name REGEXP '^(Mr|Mrs) {1,2}.* (Smith|Jones)$';
-- 查找以大写字母开头,后跟两到四个小写字母的名字。
SELECT name FROM users WHERE name REGEXP '^[A-Z][a-z]{2,4}$';
-- 查找包含至少三个数字但不超过五个数字的名字,并以 "a" 或 "e" 结尾。
SELECT name FROM users WHERE name REGEXP '[0-9]{3,5}[a|e]$';
-- 查找以 "Dr." 或 "Ms." 开头,之后是任意字符,但是不包含数字的名字。
SELECT name FROM users WHERE name REGEXP '^(Dr\\.|Ms\\.)[^0-9]*$';
-- 查找包含 "apple" 或 "banana",但后面不是 "s" 或 "z" 的名字。
SELECT name FROM users WHERE name REGEXP '(apple|banana)[^sz]$';
特殊字符的转义:使用 \
转义正则表达式中的特殊字符,如 .
、+
和 *
。在SQL中,你可能需要使用两个反斜杠 \\
来转义。
注意贪婪匹配:默认情况下,*
和 +
是贪婪的,它们会尽可能多地匹配字符。如果需要非贪婪匹配,可以考虑使用其他正则引擎或方法。
使用锚点:使用 ^
和 $
可以确保整个字符串都与正则表达式匹配,从而避免部分匹配。
字符类的注意事项:在字符类([]
)内部,不需要转义正则表达式的大多数特殊字符。
测试正则表达式:在应用到实际的数据库查询之前,使用在线工具或其他方法测试你的正则表达式是很有帮助的。
复杂性与性能:过于复杂的正则表达式可能会影响查询性能。确保在大数据集上测试查询的响应时间,并根据需要进行优化。
使用复合模式时,建议先构建并测试每个单独的部分,然后再组合它们。这样可以确保每个部分都按预期工作,从而降低整体错误的可能性。