在RegEx中使用星号来提取由特定模式包围的数据

时间:2009-01-20 14:32:12

标签: c++ regex qt4

我有一个由特定模式包含的信息组成的文本。 我唯一知道的是模式:“$ {template.start}”和$ {template.end} 为了简单起见,我将在示例中将$ {template.start}和$ {template.end}替换为“a”。

因此,案文中的一个条目是:

aINFORMATIONHEREa

我不知道这些条目中有多少是在文本中连接起来的。所以以下内容也是正确的:

aFOOOOOOaaASDADaaASDSDADa

我想写一个正则表达式来提取“a”所包含的信息。

我的第一次尝试是:

a(.*)a

只要文本中只有一个条目就可以工作。一旦有多个条目,它就会失效,因为.*匹配所有内容。因此,在a(.*)a上使用aFOOOOOOaaASDADaaASDSDADa只会导致一个捕获组包含文本的第一个和最后一个字符“a”之间的所有内容:

FOOOOOOaaASDADaaASDSDAD

我想得到的是像

captureGroup(0):  aFOOOOOOaaASDADaaASDSDADa
captureGroup(1): FOOOOOO
captureGroup(2): ASDAD
captureGroup(3): ASDSDAD

能够从文本中提取每个条目并从每个条目中提取“a”之间包含的信息将是很棒的。顺便说一下,我正在使用Qt4的QRegExp类。

任何提示?谢谢! 马库斯


之前已经看到过这个问题的多种变体。各种相关讨论:

可能还有其他人......

3 个答案:

答案 0 :(得分:5)

只需使用非贪婪的表达方式,即:

a(.*?)a

答案 1 :(得分:3)

您需要匹配以下内容:

a[^a]*a

答案 2 :(得分:0)

你已经有了几个工作答案,但我会添加一些无偿的建议:

  

使用正则表达式进行解析是一条充满危险的道路

编辑:不那么神秘:尽管有力量,灵活性和优雅,但正则表达式并不足以描述除最简单的语法之外的任何语法。这对于这里提出的问题是足够的,但如果输入语言变得更复杂,则不适合替代状态机或递归的解析器。

所以,选择使用RE来解析输入流是一个应该谨慎做出并着眼于未来的决定。