正则表达式匹配两个变量字符串之间的任何文字值

时间:2013-12-06 08:59:18

标签: sql regex oracle

我对正则表达式很新鲜

我想使用正则表达式(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.

我怎么能这样做?

谢谢

1 个答案:

答案 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,则它是可选的。