Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Oracle正则表达式查找字符串的空格或结尾_Regex_Oracle - Fatal编程技术网

Regex Oracle正则表达式查找字符串的空格或结尾

Regex Oracle正则表达式查找字符串的空格或结尾,regex,oracle,Regex,Oracle,我正在处理一个查询,该查询验证合法描述中的数据。我们的标准是输入“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

我正在处理一个查询,该查询验证合法描述中的数据。我们的标准是输入“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”,尽管从技术上讲它是无效的,因为北半部的东半部最好简化为东北部。以上所有示例都是从我的数据中的实际条目中提取的


任何帮助都将不胜感激。

我想这样的东西会给你想要的:

SELECT * FROM 
  test_data 
WHERE 
  regexp_like(quarter_cd, 
  '^([NSEW]/[2]{1}|[NSEW]{2}/[4]{1})( [NSEW]/[2]{1}| [NSEW]{2}/[4]{1})*$', 'c');
不过,它将与“E2/N2”案例相匹配。如果您改为这样做:

SELECT * FROM 
  test_data 
WHERE 
  regexp_like(quarter_cd, 
  '^([NSEW]/[2]{1}|[NSEW]{2}/[4]{1})( [NSEW]{2}/[4]{1})*$', 'c');

那么它将不匹配该位置,但也不会匹配初始位置之后包含[NSEW]/2的任何情况。所以如果你需要匹配,比如说“NW/4E/2”,这就不好了。。。西北区的东半部。

这是我卑微的尝试:

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等上的匹配

这里有一个例子来演示。我在你自己的基础上加了几个额外的箱子。这样做的问题是,它将允许所有四个部分


<>我会认真考虑不使用正则表达式来验证这个数据。而是通过PL/SQL函数传递它。在空间上分开,把你要检查的东西加起来,确保你没有超过限制。然后,您可以使用较小的正则表达式来验证空格分隔符之间的基于数据。

谢谢。看起来不错。尽管本是个例外(我承认我从未想过这个案子),但它应该达到目的。然而,如果有人能想出解决本观点的办法,我洗耳恭听。