【问题标题】:Regular Expression: Mathematically vs. Programmatically正则表达式:数学与编程
【发布时间】:2010-08-08 06:26:47
【问题描述】:

考虑以下正则表达式:

  1. 7+
  2. (7)+

对数学中的正则表达式理论非常熟悉的人是否同意这两个正则表达式在语义上是相同的?

【问题讨论】:

  • 澄清一下,问题标题中的“vs. Programmatically”部分是什么意思?
  • @Greg:我猜“数学上”的 OP 是指计算理论中的常规语言,而“编程上”是指正则表达式实现(它比常规语言识别更多)。
  • @polygenelubricants:你猜对了 :-)

标签: regex semantics formal-languages


【解决方案1】:

以编程方式(如由语言的正则表达式引擎评估)它仅在 capturing groups 结果中有所不同。

除此之外,它们是相同的。就像写((7) + (1)) 而不是7 + 1。他们评估到是一样的。 (是的,从数学上讲,常规语言不会评估任何东西)

【讨论】:

  • 我不明白你所说的“从数学上讲,常规语言不会评估任何东西”。正则表达式在数学上肯定会得到某些东西。
  • 我什至不确定这个。正则表达式描述语言,然后可以由确定性有限状态机解析。这种评估的输出是真或假,但语言本身没有价值(取决于您正在解析的 FSM)。如果我错了,请纠正我。
【解决方案2】:

是的,这两个正则表达式是相同的,因为它们都识别相同的语言。它们的书写方式不同,这只是一个符号问题。

【讨论】:

  • 这个答案使用从正则表达式理论中提取的术语具有数学品味。
【解决方案3】:

它们描述的是同一种语言吗?是的。对于试图解释该语言的人来说,它们是否意味着同样的事情?不。第二个告诉我,我应该对 7s 更感兴趣。

【讨论】:

    【解决方案4】:

    第二个减少到第一个。你同意吗

     ab+
    

     a(b)+
    

     (ab)+
    

    语义不同?

    【讨论】:

    • 嗯,数学上 ab+ 和 a(b)+ 在语义上是相同的。
    • 是的,但 (ab)+ 不是,这就是括号很重要的原因。如果选择了一个极简主义的例子(根据前两个),那么重要的差异就会丢失,这就是我们需要第三个的原因。
    【解决方案5】:

    唯一的区别是括号将封闭的模式分配给一个组,以便您可以在评估后引用该小块。

    【讨论】:

    • 不,以编程方式它们的区别不止于此。尝试在 Python 中使用 re.findall() 或在 C 中使用 POSIX regex() 将这两个正则表达式匹配到“777”。结果大相径庭。
    • 对不起,我认为 re.findall() 不是 regex() 的同义词。所以,是的,以编程方式,它们只是在分组上有所不同。但是,我对数学很感兴趣。
    猜你喜欢
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    相关资源
    最近更新 更多