-1

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

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

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

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

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

4

2 回答 2

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.

教他们的最好方法是让他们阅读这个答案

换句话说:

仅当某事物具有统一模式时才使用正则表达式

还,

  • 你无法解析回文
  • 您无法解析另一个正则表达式
  • 您无法匹配人们的姓名和电子邮件,因为它们各不相同。(电子邮件可以匹配,但有点矫枉过正
于 2014-05-04T07:15:25.260 回答
2

非常规语言的一个简单且易于理解的示例是回文语言,或者换句话说,等于其反转的字符串。用抽水引理很容易证明它的不规则性(参见维基百科:http ://en.wikipedia.org/wiki/Pumping_lemma )

但请注意,在实际计算中,区别并不十分明显,因为许多正则表达式引擎支持诸如允许识别某些非常规语言的反向引用等功能。例如,带有反向引用的正则表达式引擎可以匹配正方形或重复的语言(“PonyPony”、“123123”、“gg”等):(.*)\1如果没有反向引用,这是不可能的。

于 2014-05-04T07:17:30.887 回答