连接两个捕获组

Concatenating two capture groups

我有一个可以分成 3 部分的字符串 (Keep1 | Ignore | Keep2)。 objective 是去掉中间的子串,把另外两个串起来。为此,我创建了两个正则表达式,一个为 Keep1 创建一个捕获组,另一个为 Keep2 创建一个捕获组。

示例文本:

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

第一个正则表达式:

.*(?=<ref>)    

输出:

First String.

第二个正则表达式:

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

输出:

Second String.   

期望的输出:

First String. Second String.

到目前为止,我一直无法想出一种连接两个字符串的方法,在 flex 上可以做到吗?

(F)lex 不实现捕获组,也不实现先行断言。一般而言,它仅实现满足 "regular expression" 数学定义的构造,因此可以使用线性时间和常数 space.

工作的简单有限状态机来实现 abd

其正则表达式语法的(简短而完整的)文档位于 Flex manual

("flex"中的"f"代表"fast",但原来的"lex"也很活泼,主要是因为这个设计决定。)

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

  1. 如果你肯定能认出第一部分的token,那么你可以使用开始条件来识别token的其余部分

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

注意 (f)lex 也没有实现非贪婪重复,所以如果你想实现 "the shortest string starting with X and ending with Y",你需要使用像 (last) example in the Flex manual chapter on start conditions