永远不能用正则表达式解析的字符串

时间:2014-05-04 07:09:19

标签: regex text computer-science chomsky-hierarchy

我正在向一些优秀的程序员讲授正则。他们擅长编程但很难使用正则表达式。我的任务是训练他们,以便他们知道何时使用正则表达式,何时不使用。

在显示大多数正则表达式功能后,我发现他们正在使用正则表达式解析所有内容。这不是我想要的。我希望他们知道有些文本永远不能用正则表达式解析。

但我运气不好。我知道正则表达式可以解析常规语言。如果它是非常规语言,则无法解析它。所以我正在寻找非常规语言示例。

我的目标是当他们无法解析它时,他们会想出一些自定义解析器。

那么,你能提供一些这种非常规语言的好例子吗?

2 个答案:

答案 0 :(得分:3)

最好的例子是解析html

向学生展示:

<div>
  <div>some shit</div>
  <div>
    This is some shit again
    <div>
      Really? Is this parsable?  
    </div>
  </div>
</div>

并要求他们匹配最内部div的内容,前提是html是动态的。

一般情况下,要求学生不要使用language解析任何其他regex

教他们的最好方法是让他们阅读answer

换句话说:

仅当存在统一的某种模式

时才使用正则表达式

此外,

  • 你不能解析回文
  • 你无法解析另一个正则表达式
  • 您不能匹配人们的姓名和电子邮件,因为它们各不相同。(电子邮件可以匹配,但是过度

答案 1 :(得分:2)

非常规语言的一个简单易懂的例子是回文的语言,换句话说,就是与其反转相等的字符串。用泵引理证明它的非规律性非常容易(见维基百科:http://en.wikipedia.org/wiki/Pumping_lemma

请注意,在实际计算中,区别并不十分清楚,因为许多正则表达式引擎支持诸如允许识别某些非常规语言的反向引用等功能。具有反向引用的正则表达式引擎可以匹配例如正方形或重复的语言(&#34; PonyPony&#34;,&#34; 123123&#34;,&#34; gg&#34;等):{{ 1}}没有后向引用是不可能的。