代码之家  ›  专栏  ›  技术社区  ›  DimChtz

Flex中文本内部的多行匹配

  •  0
  • DimChtz  · 技术社区  · 6 年前

    %[ ]%

    \%\[(.*?)\]\%              return MULTILINE_TEXT;
    

    但这只适用于单行情况,不适用于多行情况。所以,我想我可以 /s :

    /\%\[(.*?)\]\%/s           return MULTILINE_TEXT;
    

    但flex认为这是一个无效的规则。我最后尝试的是:

    \%\[((.*?|\n)*?)\]\%       return MULTILINE_TEXT;
    

    这似乎奏效了,但一开始并没有停止 ]% . 在以下示例中:

    %[ Some text ...
       Some text ... ]%
    
    ... other stuff ...
    
    %[ Some more text ...
       Some more text ... ]%
    

    flex将把整个东西作为一个标记返回。我能做什么?

    1 回复  |  直到 6 年前
        1
  •  4
  •   rici    6 年前

    *? flex将其视为非贪婪匹配。

    . 通过设置 s 旗帜;这一变化适用于该地区 在内部 括号(不在标志设置之后,如在PCRE中):

    "%["(?s:.*)"%]"
    

    更常见的是,可以看到与lex兼容的用法:

    "%["(.|\n)*"%]"
    

    您也可以使用 x 可读性稍高的正则表达式的标志:

    (?xs: "%[" .* "%]" )
    

    标记在定义中不起作用,仅在模式规则中起作用。)

    引用字符串(如上所述)是另一种(f)lex特定语法,它比反斜杠转义更可读,尽管反斜杠转义也可以工作。但是flex没有实现PCRE/Gnu/JS扩展,比如 \w \s .

    the flex manual 关于flex正则表达式的完整指南;如果你已经习惯了其他regex语法,那么它绝对值得一读。

    %[ %] 不能嵌套,因此您确实希望匹配以第一个结束 %] ,您可以使用以下内容:

    %\[([^%]|%+[^]])*%+\]   or  (?x: "%[" ( [^%] | %+ [^]] )* %* "%]" ) 
    

    %[ % 或者一系列 % ] ] .

    %+ 而不是 %

    %[%% text surrounded by percents%%%]
    

    一个更可读的解决方案,它还允许嵌套 %[ 是用来 start conditions . 这里有一个非常类似的解决方案的完整例子 this answer