You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MySQL中修改Regex以精准匹配西班牙身份证号码

修正西班牙身份证号码的MySQL正则匹配方案

问题根源

你之前的正则存在两个核心问题:

  • 未限定匹配边界,导致会匹配长字符串(如哈希值)中符合8位数字+字母的子串
  • 未彻底排除科学计数法这类带特殊符号的格式,仅限制了前缀但未约束结尾

修正后的正则表达式

使用MySQL支持的单词边界语法[[:<:]]和[[:>:]],确保匹配独立的身份证号码,而非其他字符串的片段:

[[:<:]][0-9]{8}[TRWAGMYFPDXBNJZSQVHLCKEtrwagmyfpdxbnjzsqvhlcke][[:>:]]
  • [[:<:]]:匹配单词起始边界,避免前面出现数字、字母或小数点(如科学计数法中的.)
  • [0-9]{8}:严格匹配8位数字
  • [TRWAGMYFPDXBNJZSQVHLCKEtrwagmyfpdxbnjzsqvhlcke]:仅允许西班牙身份证规定的校验字母(已排除I、Ñ、O、U)
  • [[:>:]]:匹配单词结束边界,避免后面跟着其他字符(如哈希值的后续字母)

进一步校验字母合法性(可选)

如果需要严格验证校验字母是否符合规则(数字部分除以23的余数对应指定字母表),可以结合SQL计算实现:

SELECT id_card
FROM your_table
WHERE id_card REGEXP '[[:<:]][0-9]{8}[TRWAGMYFPDXBNJZSQVHLCKEtrwagmyfpdxbnjzsqvhlcke][[:>:]]'
  AND SUBSTRING(id_card, 9, 1) = SUBSTRING('TRWAGMYFPDXBNJZSQVHLCKE', MOD(CAST(SUBSTRING(id_card, 1, 8) AS UNSIGNED), 23) + 1, 1);

这段SQL先筛选格式符合的记录,再通过计算验证校验字母是否与数字部分匹配。

内容的提问来源于stack exchange,提问作者Javier Gonzalez Moncayo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:20:28