正则表达式创建一个解决以下模式的表达式

时间:2016-05-28 14:33:34

标签: regex formal-languages

这是大学可选作业的一部分,我们有点挣扎。

要解决的模式并不难以说实话我们不能理解它,创建一个字母{a,b,c}包含至少一个{{1}的表达式和a一个。

目前的两种方法是

b

但是这两个都有缺陷,首先不允许ccbacc第二个允许ccaacc。

问候

6 个答案:

答案 0 :(得分:6)

生成要求可以有两个规则,一个是a之前的b

S₁ → [abc]* a [abc]* b [abc]*

另一个是b之前的a

S₂ → [abc]* b [abc]* a [abc]*

现在只需使用替代运算符

将它们组合在一起
S → S₁ | S₂
  = [abc]* a [abc]* b [abc]* | [abc]* b [abc]* a [abc]*

使用规则AB|AC = A(B|C)AC|BC = (A|B)C

可以简化此操作
S → [abc]* (a [abc]* b | b [abc]* a) [abc]*

我认为你的作业只涉及正式语言。在实际编程中,只需使用indexOf或类似函数来查明字符串是否包含ab。正则表达式对于此任务来说太沉重了。

答案 1 :(得分:5)

作为@ kennytm的答案的补充,如果你以一种针对第一次出现的字符的方式编写模式,可以省略一些字母" a"和" b" (而不是任何地方)。显然,这两种方法完全相同:

c*(a(a|c)*b|b(b|c)*a)(a|b|c)*
^   ^        ^---------------- only need "b" and "c" until the first "a"
|   '------------------------- only need "a" and "c" until the first "b"
'----------------------------- only need "c" until the first "a" or the first "b"

或使用类:

c*(a[ac]*b|b[bc]*a)[abc]*

答案 2 :(得分:2)

描述

你真的想为这个

使用先行断言
^(?=.*a)(?=.*b)[abc]*$

Regular expression visualization

此正则表达式将执行以下操作:

  • 确保字符串仅包含字母abc
  • 要求字符串至少包含一个a
  • 要求字符串至少包含一个b

实施例

现场演示

https://regex101.com/r/uK7hZ8/1

示例文字

dabc
fbca
cab
bac
acb
cba

样本匹配

cab
bac
acb
cba

解释

NODE                     EXPLANATION
----------------------------------------------------------------------
  ^                        the beginning of a "line"
----------------------------------------------------------------------
  (?=                      look ahead to see if there is:
----------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
----------------------------------------------------------------------
    a                        'a'
----------------------------------------------------------------------
  )                        end of look-ahead
----------------------------------------------------------------------
  (?=                      look ahead to see if there is:
----------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
----------------------------------------------------------------------
    b                        'b'
----------------------------------------------------------------------
  )                        end of look-ahead
----------------------------------------------------------------------
  [abc]*                   any character of: 'a', 'b', 'c' (0 or more
                           times (matching the most amount possible))
----------------------------------------------------------------------
  $                        before an optional \n, and the end of a
                           "line"
----------------------------------------------------------------------

答案 3 :(得分:1)

试试这个:

/.*?((a.*?b)|(b.*?a)).*/

答案 4 :(得分:1)

您可以使用正向前瞻断言:

(?=.*a)(?=.*b)

要返回匹配中的字符,您需要一个非断言匹配

[abc]*(?=.*a)(?=.*b)[abc]*

答案 5 :(得分:0)

首先关闭这是一个没有正则表达式的最佳解决的教科书问题:

set(input) < set("ab")

现在,要进行旋转,请注意受限字母

因此,问题等同于:

"acccccb" in input + reversed(input)

c的任意重复次数;这样你的表达就变成了:

ac*b|bc*a

完成