我对regex非常陌生。我被困在一个无法解决的特定问题上。 regex专家的指导深表感谢。
1)下面是pl / sql字符串,需要使用正则表达式进行匹配。
TYPE T_OM_EPV2_LINE_REC_TYPE
IS
RECORD
(
ORDER_NO PS_OM_EPV2_LINE.ORDER_NO%type,
OM_SUBMIT_NBR PS_OM_EPV2_LINE.OM_SUBMIT_NBR%type);
2)这是我要使用的正则表达式
^TYPE [\w]+[\s]IS[\s]RECORD[\s]\([\s]([\w]+ [\w]+\.[\w]+%type.)
3)我可以匹配,
TYPE T_OM_EPV2_LINE_REC_TYPE
IS
RECORD
(
ORDER_NO PS_OM_EPV2_LINE.ORDER_NO%type,
但不是,OM_SUBMIT_NBR PS_OM_EPV2_LINE.OM_SUBMIT_NBR%type
(最后一行)
4)根本原因是正则表达式尝试匹配最后一行,但缺少前四行。
5)我尝试捕获并重复正则表达式的概念(以将行作为组重复最后一行),但是仍然没有实现输出。
请问对此有何建议或见解?
答案 0 :(得分:0)
由于最后一行没有嵌套括号,因此可以使用
^TYPE \w+\s+IS\s+RECORD\s+\([^()]*\)
请参见regex demo。
详细信息
^
-字符串或行的开头TYPE
-文字子字符串\w+
-1个以上的字符字符\s+
-超过1个空格IS
-文字子字符串\s+
-超过1个空格RECORD
-文字子字符串\s+
-超过1个空格\(
-一个(
字符[^()]*
-除(
和)
以外的0多个字符\)
-一个)
字符。要管理嵌套括号,可以将\([^()]*\)
替换为(\((?:[^()]++|(?1))*\))
。参见this regex demo。
如果您只想匹配最后一个;
之前的任何文本,请使用^TYPE \w+\s+IS\s+RECORD\s+(\([\s\S]*\))
。参见this demo。