【问题标题】:Regular Expression Matching Odd Number of B's with A's in between (DFS to Regex)正则表达式匹配奇数个 B 与 A 之间(DFS 到正则表达式)
【发布时间】:2019-03-11 12:32:20
【问题描述】:

假设我有一个识别语言 L 的确定性有限状态自动机,它由 {a, b}* 中包含奇数个 b 的所有字符串组成 使得字符串中每两个 b 之间至少有一个 a。

我设法为此导出了有限状态机,如 example 所示(复选框表示已接受状态):

但现在我被困住了;如何将其转换为正则表达式?我真的很挣扎,因为这是一个有点复杂的例子。我试过了:

a*b[a*ba*b]*a*

但这仍然匹配偶数个 b 的字符串。什么是正确的正则表达式?

【问题讨论】:

  • 忘了问,字符串的开头和结尾也可以有as 吗?例如aba,或者as 必须在bs 之间?
  • 由于向我提供了问题,因此措辞有些不清楚,但我认为 a 可以在开头或结尾。只要它有奇数个 b,在任意 2 个连续的 b 之间至少有一个 a。
  • 你有a*b[a*ba*b]*a*,你想要a*b(a*ba*b)*a*。方括号表示您正在匹配它们之间的所有字符,即它将匹配a、b 和*。圆括号用于组,这是您想要的。

标签: regex regular-language finite-automata


【解决方案1】:

你可以使用

^a*b(?:(?:a+b){2})*a*$

https://regex101.com/r/bSpZ40/2

用普通语言:

  • 零个或多个as,后跟:

  • b,后跟以下组的任意数量的重复:

    • (至少一个a,后跟b)重复两次(确保bs 的总数是奇数)
  • 后跟零个或多个as

所以可以有一个b,或者三个bs,或者五个bs,等等,每个b之间必须有一些as,并且可以有前导和/ 或尾随 as。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多