我正在处理验证 quarter 的查询合法描述中的数据。我们的标准是输入“SE/4”来标记东南四分之一或“SE/4 NW/4”来标记西北四分之一的东南四分之一。我正在为如何通过正则表达式构建结构来检查字符串的空格或结尾而苦恼。
到目前为止,这是我的正则表达式的一些示例数据。
WITH test_data AS (
SELECT 'NW/4' AS quarter_cd FROM dual UNION ALL --VALID
SELECT 'E/2 SW/4' FROM dual UNION ALL --VALID
SELECT 'W/2' FROM dual UNION ALL --VALID
SELECT 'SW/4 NE/4' FROM dual UNION ALL --VALID
SELECT 'SW/4 NE/4 NW/4' FROM dual UNION ALL --VALID, THEY CAN REPEAT AN UNKNOWN NUMBER OF TIMES
SELECT 'E/2 N/2' FROM dual UNION ALL --TECHNICALLY VALID BUT WOULD LIKE TO EXCLUDE (1/2 of 1/2 is a 1/4) -> NE/4
SELECT 'E/2 SW/4, SE/4' FROM dual UNION ALL --INVALID, HAS A COMMA (TWO QUARTER ENTRIES ON ONE ROW)
SELECT 'E/2 SW/4 & SE/4' FROM dual UNION ALL --INVALID, HAS AN AMPERSAND (TWO QUARTER ENTRIES ON ONE ROW)
SELECT 'E/2 SW/' FROM dual UNION ALL --INVALID, INCOMPLETE ENTRY
SELECT 'SE/4SW/4' FROM dual UNION ALL --INVALID, NO SPACE BETWEEN DEFINITIONS
SELECT 'SE/2' FROM dual UNION ALL --INVALID, SOUTHEAST HALF DOES NOT MAKE SENSE
SELECT 'N/4' FROM dual UNION ALL --INVALID, NORTH QUARTER DOES NOT MAKE SENSE
SELECT 'LOT 1' FROM dual --INVALID, LOTS WILL BE DEALT WITH SEPARATELY
)
SELECT * FROM test_data
WHERE regexp_like(quarter_cd, '^([NSEW]/[2]{1}|[NSEW]{2}/[4]{1})+', 'c');
我代码中的正则表达式只是我的众多尝试之一。我在查询中标记了应该返回的结果。为了简单起见,我愿意允许返回“E/2 N/2”,尽管从技术上讲它是无效的,因为最好将北半部的东半部简化为东北部。以上所有示例均来 self 数据中的实际条目。
如有任何帮助,我们将不胜感激。
最佳答案
这是我卑微的尝试:
select *
from test_data
where regexp_like(quarter_cd
, '^((([NSEW]{1}/2)|[NS]{1}[EW]{1}/4)([[:space:]]|$))+$'
, 'c')
恐怕它会返回 E/2 N/2
。
这个
- 允许 N S E W 之一后跟 2
- 或 N S 和 E W 之一后跟 4
- 后面必须跟一个空格或行尾
- 允许它贪婪地匹配
- 必须在行尾结束
通过拆分您的[NSEW]
,它排除了在 NS 或 EW 等上的匹配。
这是一个 SQL Fiddle展示。我在你自己的基础上添加了几个额外的案例。这个问题是它会允许所有四个部分。
我会认真考虑不使用正则表达式来验证此数据。而是通过 PL/SQL 函数传递它。拆分空间并添加您必须检查的内容,以确保您没有超过限制。然后,您可以使用较小的正则表达式来验证空格分隔符之间的基础数据。
关于regex - Oracle 正则表达式寻找空格或字符串结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11107384/