【发布时间】:2015-11-23 06:16:38
【问题描述】:
这是一个输入
<some tag: 1 2 3>
这是另一个输入
<some tag: 1 2 3>
some extra data
</some tag>
两个输入出现在同一个字符串中。它看起来像这样:
<some tag: 1 2 3>
<some tag: 4 5 6>
some extra data
</some tag>
注意:这不是 XML 解析。我只是碰巧喜欢 XML 的外观。
这是两条独立的信息,我希望能够正确捕获它们。
第一场比赛应该给
- 1 2 3
第二场比赛应该给
- 4 5 6
- 一些额外的数据
标签本身的名称并不重要;它只是作为一个指标来表明这是我正在寻找的数据。
是否可以编写一个正则表达式来正确捕获这一点?
我使用的正则表达式是
<some tag:(.+?)>(([\s\S]*?)<\/some tag>)?
所以基本上,第一行是必需的,但后面的都是可选的。
然而,这里的问题是当有人混合两种形式的输入时:第一个匹配会采用这个
1 2 3
但是它会继续并捕获它下面的所有内容,因为最后存在一个“关闭”标签。所以实际的匹配是这样的:
第一
1 2 3
第二
<some tag: 4 5 6>
some extra data
我的另一个解决方案是简单地制作它以便您编写
<some tag: 1 2 3 />
<some tag: 4 5 6>
some extra data
</some tag>
所以我将有一个正则表达式来解析没有任何额外数据的那些,然后另一个正则表达式来处理那些有的,但如果我可以避免写额外的 / 那会更好.
我可能会使用 CFG 来解析它,但我希望能够只向它抛出一个正则表达式,但我不确定正则表达式是否足够强大以支持它。
【问题讨论】:
-
当且仅当您的标签不能任意嵌套时,正则表达式才会足够强大。但即便如此,我认为它们会变得如此复杂,以至于你最好用你选择的编程语言编写几行代码来区分情况,并且只使用正则表达式作为较低级别的构建块。跨度>
-
大多数语言所称的“正则表达式”实际上并不是正则表达式。例如。 Perl 5.12 和 Ruby 1.9 的正则表达式可以解析非常规语言,甚至可能解析所有上下文无关语言。 (Ruby 甚至可以选择和命名递归,如果有一天有人无聊到证明他们是图灵完备的,我不会感到惊讶。)
标签: regex string-matching