连接两个捕获组

问题描述 投票:1回答:1

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

Example text:

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

First regular expression:

.*(?=<ref>)    

Output:

First String.

Second regular expression:

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

Output:

Second String.   

Desired Output:

First String. Second String.

到目前为止,我还没有找到连接两个字符串的方法,在flex上有可能这样吗?

c regex flex-lexer
1个回答
1
投票

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

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

(“flex”中的“f”代表“快”,但原来的“lex”也非常活泼,基本上是因为这个设计决定。)

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

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

注意(f)lex也没有实现非贪婪的重复,所以如果你想实现“以X开头并以Y结尾的最短字符串”,你需要使用像(last) example in the Flex manual chapter on start conditions中所示的技术。

© www.soinside.com 2019 - 2024. All rights reserved.