正则表达式仅查找数字+文本的字母数字组合,无特殊

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');

【讨论】:

以上是关于正则表达式仅查找数字+文本的字母数字组合,无特殊的主要内容,如果未能解决你的问题,请参考以下文章

常用数字字母组合正则表达式

求一个正则表达式,要求 数字,大写字母,小写字母,特殊字符 至少两种或两种以上组合的正则表达式。

sql 使用正则表达式将指定列选择为字母数字(无特殊字符)

js如何正则验证密码

使用正则表达式替换仅保留正斜杠和数字

java正则表达式 过滤特殊字符 只允许中文、字母和数字, 该怎么写?急。。。