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

时间:2019-07-26 04:43:13

标签: regex plsql

必须在输入字符串中找到长度为4个字母数字的固定模式

我只尝试了数字和数字,但无法弄清楚我将如何只限于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

2 个答案:

答案 0 :(得分:0)

与此类似的正则表达式将捕获您用文字概述的内容:

^(([[: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。

答案 1 :(得分:0)

在第二个REGEXP中,您需要忽略具有非字母数字字符(逗号除外)以及数字组的大小等于4的行,这是必需的,因为根据{{3},Oracle不支持正向查找}。

我建议的解决方案是...

FROM node:10

WORKDIR /usr/src/app

# Copy source files.
COPY . .
RUN yarn

# Run app.
CMD [ "yarn", "start" ]