选择直到下一个点后跟\ s?

时间:2015-09-01 16:01:03

标签: regex

我可以使用一些写一个正则表达式的帮助。我有以下文字:

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”。

但我无法弄清楚如何编写这个正则表达式。

3 个答案:

答案 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(扫描仪)标记你的字符串很有用。这种方法的优点是词法分析器可以处理空白区域,并允许您更详细地指定感兴趣的块的形式。