Mysql - 正则表达式


规则


模式 描述
^ 匹配输入字符串的开始位置。如果设置了 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 次。

示例


1. 模式 ^


  • 匹配以特定字符或字符串开头的数据。
-- 选择所有以 "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)';


2. 模式 $


  • 匹配以特定字符或字符串结尾的数据。
-- 选择所有以 "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)$';


3. 模式 .


  • 匹配任意字符。
-- 选择名字中包含任意两个连续字符的数据
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].';


4. 模式 [...]


  • 匹配字符集中的任意字符。
-- 选择名字中包含 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 '[\\.!?]';


5. 模式 [^...]


  • 匹配不在字符集中的任意字符。
-- 选择名字中不包含 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 '[^\\.!?]';


6. 模式 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';


7. 模式 *


  • 匹配前面的子表达式零次或多次。
-- 选择名字中包含 "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*';


8. 模式 +


  • 匹配前面的子表达式一次或多次。
-- 选择名字中包含 "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+';


9. 模式 {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}';


10. 模式 {n,m}


  • 匹配前面的子表达式最少 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]$';


注意问题和技巧


  1. 特殊字符的转义:使用 \ 转义正则表达式中的特殊字符,如 .+*。在SQL中,你可能需要使用两个反斜杠 \\ 来转义。

  2. 注意贪婪匹配:默认情况下,*+ 是贪婪的,它们会尽可能多地匹配字符。如果需要非贪婪匹配,可以考虑使用其他正则引擎或方法。

  3. 使用锚点:使用 ^$ 可以确保整个字符串都与正则表达式匹配,从而避免部分匹配。

  4. 字符类的注意事项:在字符类([])内部,不需要转义正则表达式的大多数特殊字符。

  5. 测试正则表达式:在应用到实际的数据库查询之前,使用在线工具或其他方法测试你的正则表达式是很有帮助的。

  6. 复杂性与性能:过于复杂的正则表达式可能会影响查询性能。确保在大数据集上测试查询的响应时间,并根据需要进行优化。

使用复合模式时,建议先构建并测试每个单独的部分,然后再组合它们。这样可以确保每个部分都按预期工作,从而降低整体错误的可能性。


你可能感兴趣的:(Mysql,mysql,正则表达式,数据库)