1

我有一个文本,其中包含由某种模式包围的信息。我唯一知道的是模式: "${template.start}" 和 ${template.end} 为了简单起见,我将在例子。

所以文本中的一个条目是:

aINFORMATIONHEREa

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

aFOOOOOOaaASDADaaASDSDADa

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

我的第一次尝试是:

a(.*)a

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

FOOOOOOaaASDADaaASDSDAD

我想得到的是

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

如果能够从文本中提取每个条目,并从每个条目中提取“a”之间的信息,那就太好了。顺便说一句,我正在使用 Qt4 的 QRegExp 类。

有什么提示吗?谢谢!马库斯


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

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

4

3 回答 3

6

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

a(.*?)a
于 2009-01-20T14:35:35.030 回答
3

您需要匹配以下内容:

a[^a]*a
于 2009-01-20T14:39:29.733 回答
0

您已经有几个可行的答案,但我会添加一些无偿的建议:

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

编辑:为了不那么神秘:对于所有的力量、灵活性和优雅,正则表达式的表达能力不足以描述除了最简单的语法之外的任何内容。对于此处提出的问题,它们已经足够了,但如果输入语言变得更复杂,则不适合替代状态机或递归体面的解析器。

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

于 2009-01-20T15:08:36.307 回答