连接两个捕获组

时间:2019-03-25 16:49:49

标签: c regex flex-lexer

我有一个字符串,该字符串可以分为3个部分(Keep1 | Ignore | Keep2)。目的是删除中间的子字符串并连接其他两个字符串。为此,我创建了两个正则表达式,一个为Keep1创建捕获组,另一个为Keep2创建捕获组。

示例文本:

First String.<ref> IGNORE </ref> Second String.

第一个正则表达式:

.*(?=<ref>)    

输出:

First String.

第二个正则表达式:

(?<=&lt;\/ref&gt;).*   

输出:

Second String.   

所需的输出:

First String. Second String.

到目前为止,我一直无法找出连接两个字符串的方法,在flex上可能发生这种事情吗?

1 个答案:

答案 0 :(得分:1)

(F)lex不实现捕获组,也不实现超前断言。一般而言,它仅实现满足“正则表达式”数学定义的构造,因此可以使用在线性时间和恒定空间中工作的简单有限状态机来实现abd。

其正则表达式语法的(简短而完整的)文档可在Flex manual中找到。

(“ flex”中的“ f”代表“ fast”,但是最初的“ lex”也相当活泼,主要是因为这个设计决定。)

您有两种选择,具体取决于令牌的确切性质:

  1. 如果您可以肯定地从第一部分中识别出令牌,则可以使用开始条件来识别令牌的其余部分

  2. 否则,您可以在一个正则表达式中识别整个令牌,然后重新扫描以找出要保留的部分。您可能无法使用flex进行第二次扫描。同样,您可以使用开始条件为重新扫描应用不同的规则,但这将取决于图案的确切性质。您还可以使用正则表达式库(Posix标准库或其他更灵活的库,如PCRE)进行重新扫描。

请注意,(f)lex也不会实现非贪婪重复,因此,如果要实现“以X开头并以Y结尾的最短字符串”,则需要使用一种技巧就像(last) example in the Flex manual chapter on start conditions

中显示的那样
相关问题