我可以使用一些写一个正则表达式的帮助。我有以下文字:
DEFINE BROWSE BW_SC20SDAN
&ANALYZE-SUSPEND _UIB-CODE-BLOCK _DISPLAY-FIELDS BW_SC20SDAN C-Win _FREEFORM
QUERY BW_SC20SDAN NO-LOCK DISPLAY
ZTYACC.prime COLUMN-LABEL "" FORMAT "X(35)"
ZUNACT.sec COLUMN-LABEL " " FORMAT "X(30)"
INFDON.sep COLUMN-LABEL "" FORMAT "99/99/9999"
IF INFDON.top THEN "S" ELSE (IF INFDON.REPORT THEN "R" ELSE (IF INFDON.prime <> "" THEN INFDON.prime ELSE "")) COLUMN-LABEL "R" FORMAT "X(1)"
/* _UIB-CODE-BLOCK-END */
&ANALYZE-RESUME
WITH SEPARATORS SIZE 83.57 BY 5.08
BGCOLOR 15 FGCOLOR 1 FONT 6 FIT-LAST-COLUMN.
我必须在文本文件中找到这整个块,到目前为止我有这个正则表达式:
(?:DEFINE|DEF)\s([\w\s]*)BROWSE\s+([\w-]+)\s+([^.]*)\.
我的问题是它只选择了这个:
DEFINE BROWSE BW_SC20SDAN
&ANALYZE-SUSPEND _UIB-CODE-BLOCK _DISPLAY-FIELDS BW_SC20SDAN C-Win _FREEFORM
QUERY BW_SC20SDAN NO-LOCK DISPLAY
ZTYACC.
当我想选择直到最后一点。基本上,我想要应用的规则是“直到下一个点后跟\ s”。
但我无法弄清楚如何编写这个正则表达式。
答案 0 :(得分:0)
允许“非点”[^.]
或“点后面没有空格”\.(?!\s)
:
DEF(INE)?\s([\w\s]*)BROWSE\s+([\w-]+)\s+(([^.]|\.(?!\s))*)\.
还要注意领先术语的简化。
答案 1 :(得分:0)
可能最可读的方法是
(?:DEFINE|DEF)\s([\w\s]*)BROWSE[\S\s]+?\.\s
你将+
运算符变为la ?,默认情况下它会匹配所有内容,直到它达到第一个句点后跟一个空格。
答案 2 :(得分:0)
如果您可以选择使用不合法的正则表达式库,那么最简单但最接近您指定的库
DEFINE\s+BROWSE.*?\.\s
但请注意,输入文本末尾可能没有尾随空格,最后一个语句不匹配。
你可能会发现像flex或ANTLR这样的lexer(扫描仪)标记你的字符串很有用。这种方法的优点是词法分析器可以处理空白区域,并允许您更详细地指定感兴趣的块的形式。