正则表达式仅查找数字+文本的字母数字组合,无特殊
Posted
技术标签:
【中文标题】正则表达式仅查找数字+文本的字母数字组合,无特殊【英文标题】:regex to find alphanumeric combination of number+text only no special 【发布时间】:2019-07-26 04:43:13 【问题描述】:必须在输入字符串中找到长度为 4 字母数字的修复模式
我只尝试过数字和 alnum,但无法弄清楚我如何只限制为 char+num 而没有其他特殊字符或数字本身
WITH tab AS (
SELECT '''1234,4565,1212,7658''' AS str FROM dual UNION ALL
SELECT '''abce,dddd,jdjd,rdrd,dder''' AS str FROM dual UNION ALL
SELECT '''123m,d565,1dd2,7fur' AS str FROM dual UNION ALL
SELECT '''1m@4,4u#5,1212,abcd' AS str FROM dual UNION ALL
SELECT '''abcd,456a,d212,7658''' AS str FROM dual UNION ALL
SELECT '''1234,4565,1212'',7658''' AS str FROM dual
)
SELECT * FROM tab t
WHERE REGEXP_LIKE(t.str ,'^['']([[:alnum:]]4,)+([[:alnum:]]4)['']$')
AND NOT REGEXP_LIKE(t.str ,'^['']([[:digit:]]4,)+([[:digit:]]4)['']$')
预期
abce,dddd,jdjd,rdrd,dder
123m,d565,1dd2,7fur
没想到
1m@4,4u#5,1212,abcd' --since this one has only 'abcd' valid but not others
abcd,456a,d212,7658 --since this one has '7658' which is invalid but others are
1234,4565,1212 --all numeric should be ignored
【问题讨论】:
单独使用正则表达式很难实现。您应该真正规范化您的数据模型,并将 CSV 字符串值放到单独的记录中。 尝试用AND NOT REGEXP_LIKE(t.str ,'[[:digit:]]4')
替换最后一个条件
@hotfix 这不会涵盖所有情况或整个 CSV 字符串。
【参考方案1】:
与此类似的正则表达式将捕获您用文字概述的内容:
^(([[:alpha:]][[:alnum:]]3|[[:alnum:]][[:alpha:]][[:alnum:]]2|[[:alnum:]]2[[:alpha:]][[:alnum:]]|[[:alnum:]]3[[:alpha:]]),)*([[:alpha:]][[:alnum:]]3|[[:alnum:]][[:alpha:]][[:alnum:]]2|[[:alnum:]]2[[:alpha:]][[:alnum:]]|[[:alnum:]]3[[:alpha:]])$
SELECT * FROM tab WHERE REGEXP_LIKE(str, '^(([[:alpha:]][[:alnum:]]3|[[:alnum:]][[:alpha:]][[:alnum:]]2|[[:alnum:]]2[[:alpha:]][[:alnum:]]|[[:alnum:]]3[[:alpha:]]),)*([[:alpha:]][[:alnum:]]3|[[:alnum:]][[:alpha:]][[:alnum:]]2|[[:alnum:]]2[[:alpha:]][[:alnum:]]|[[:alnum:]]3[[:alpha:]])$', 'i');
但是,我无法确定您在示例中对单引号的使用,因此您需要对其进行修改以处理您的引号。 我建议您更新您的问题,以便更清楚地了解报价。
另外请注意,我对 PLSQL 并不十分熟悉 - 编写时考虑了 mysql。
【讨论】:
【参考方案2】:您在第二个 REGEXP 中只需要忽略包含非字母数字字符(逗号除外)和大小等于 4 的数字组的行。这是必要的,因为 Oracle 不支持根据 this web site 的正向前瞻。
我提出的解决方案是……
SELECT * FROM tab t
WHERE REGEXP_LIKE(t.str ,'^(([[:alnum:]]4),)*([[:alnum:]]4)$')
AND NOT REGEXP_LIKE(t.str ,'[^[:alnum:],]|[0-9]4');
【讨论】:
以上是关于正则表达式仅查找数字+文本的字母数字组合,无特殊的主要内容,如果未能解决你的问题,请参考以下文章