我有一个由特定模式包含的信息组成的文本。 我唯一知道的是模式:“$ {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类。
任何提示?谢谢! 马库斯
之前已经看到过这个问题的多种变体。各种相关讨论:
可能还有其他人......
答案 0 :(得分:5)
只需使用非贪婪的表达方式,即:
a(.*?)a
答案 1 :(得分:3)
您需要匹配以下内容:
a[^a]*a
答案 2 :(得分:0)
你已经有了几个工作答案,但我会添加一些无偿的建议:
使用正则表达式进行解析是一条充满危险的道路
编辑:不那么神秘:尽管有力量,灵活性和优雅,但正则表达式并不足以描述除最简单的语法之外的任何语法。这对于这里提出的问题是足够的,但如果输入语言变得更复杂,则不适合替代状态机或递归的解析器。
所以,选择使用RE来解析输入流是一个应该谨慎做出并着眼于未来的决定。