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

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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yueerba126

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值