我对正则表达式很新鲜
我想使用正则表达式(REGEXP_LIKE
)来搜索Oracle数据库表列,其值介于2个格式为"ANNNN" or "ANNNNA"
的变量字符串之间,例如
[A1000 - Z9999] returns 'A1111', 'B1234', 'T5678', etc.
[B1234S - C8888S] returns 'B1234S', 'B1235S', 'C88888S', etc.
[A1000S - D9999] returns 'A1000S', 'A1001', 'A1001S', etc.
我怎么能这样做?
谢谢
答案 0 :(得分:0)
不要使用正则表达式。用它来检查格式是否正确,然后转换为数字以检查值。
你的第一个例子:
SELECT *
FROM your_table
WHERE REGEXP_LIKE(your_column, '^[A-Z]\d{4}$')
AND TO_NUMBER(REGEXP_REPLACE(your_column, '\D')) BETWEEN 1000 AND 9999;
你的第二个例子:
SELECT *
FROM your_table
WHERE REGEXP_LIKE(your_column, '^[BC]\d{4}S$')
AND TO_NUMBER(REGEXP_REPLACE(your_column, '\D')) BETWEEN 1234 AND 8888;
你的第三个例子:
SELECT *
FROM your_table
WHERE REGEXP_LIKE(your_column, '^[A-Z]\d{4}S?$')
AND TO_NUMBER(REGEXP_REPLACE(your_column, '\D')) BETWEEN 1000 AND 9999;
如果您的用户界面仅允许用户输入您指定的格式,则必须将这些格式转换为条件。您不能指望用户输入复杂的正则表达式,因此您无论如何都必须进行某些转换。
您可以使用用户输入的裸值来逃避。对于第一个例子,我认为一个简单的BETWEEN
会起作用。
SELECT *
FROM your_table
WHERE your_column BETWEEN min_value AND max_value;
对于其他示例,如果您可以对用户将输入的字符串格式进行假设,则可以将这些转换为条件。
例如,如果您知道这些字符串的格式为[A-Z][0-9]{4}S?
(一个字母,后跟四位数字,后跟一个可选的S),您可以分析字符串并从中构建一个正则表达式。
对于你的第二个例子,这意味着匹配两者的第一个字母并从中创建一个字符类,匹配两者的数字并将它们用作BETWEEN
的下限和上限并匹配可选的S - 如果两个字符串都有,那么它是强制性的,如果两个字符串都没有,则不允许,如果只有一个字符串有S,则它是可选的。