【问题标题】:Is there a way for me to use regex to distinguish this set of input?有没有办法让我使用正则表达式来区分这组输入?
【发布时间】: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


【解决方案1】:

如果你的语法没有区分开始标签和自结束标签,那么你最终会遇到这种情况:

<a>
  <a>
    Some text
  </a>
  <b>
    Some more text
  </b>

a的结束标签是指第一个a标签还是第二个?像这样缩进,我的意图更清楚,尽管您同样可以看到以下内容:

<a><a>Some text</a><b>Some more text</b>

困难在于如何解释连续的标签。 b 是根标签还是在第一个 a 标签下?

毕竟是你的语言,你可以选择任何一种方式来解释它,但我个人更愿意从语言中完全消除歧义,这样任何使用它的人都会知道它是如何解释的。添加一个斜线来表示一个自闭合标签似乎是最合乎逻辑的结论,它需要编写它的人最少的努力并且具有明确的含义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2019-02-11
    • 1970-01-01
    • 2011-04-15
    • 2016-08-29
    • 1970-01-01
    相关资源
    最近更新 更多