Algorithm 语言(a+;)*与a*相同吗?
快速提问,如果a是正则表达式,那么a*=(a+)* (a+)*是有效的表达式吗?如果是,那么有人能解释为什么它与a*相同吗?很抱歉我在这里询问,但是我在谷歌上找不到任何东西。是的,Algorithm 语言(a+;)*与a*相同吗?,algorithm,regular-language,Algorithm,Regular Language,快速提问,如果a是正则表达式,那么a*=(a+)* (a+)*是有效的表达式吗?如果是,那么有人能解释为什么它与a*相同吗?很抱歉我在这里询问,但是我在谷歌上找不到任何东西。是的,(a+*是有效的,相当于a*。第一个表达式表示“至少一个a,重复0次或多次的序列”,第二个表达式表示“一个a,重复0次或多次”。很明显,两者都是等效的。否,(a+)*与a*匹配相同的字符串,但由于其原因,这是一种反模式。(a+)*本身并不有害,但是如果使用(a+)*x模式,许多正则表达式引擎可以使用“aaaaaaaaa
(a+*
是有效的,相当于a*
。第一个表达式表示“至少一个a
,重复0次或多次的序列”,第二个表达式表示“一个a
,重复0次或多次”。很明显,两者都是等效的。否,(a+)*
与a*
匹配相同的字符串,但由于其原因,这是一种反模式。(a+)*
本身并不有害,但是如果使用(a+)*x
模式,许多正则表达式引擎可以使用“aaaaaaaaaaaaaaaaaaaaaaaaaaaab”
字符串冻结。另一个区别是,在(a+)*
中有一个捕获组,L(a*)=L((a+)*)
。我们可以通过显示L(a*)
是L((a+)*)
的子集来证明这一点,反之亦然
为了证明L(a*)
是L((a+)*)
的子集,我们必须证明由a*
生成的任何内容也由(a+)*
生成。我们只需要提供一种生成方法。正则表达式a*
为所有整数n生成字符串e=a^0,a=a^1,aa=a^2,…,a^k。要生成其中任何一个,只需从子表达式a+
中选择生成的子字符串a
并替换即可,这将生成相同的表达式a*
,并显然以相同的方式生成相同的a字符串
为了证明L((a+)*)
是L(a*)
的子集,我们只需要指出表达式(a+)*
中唯一的字母符号是a
,因此表达式只能生成a的字符串。因为a*
生成了所有这样的字符串,所以L((a+)*
是一个子集或L(a*)
也同样清楚
因为
L(a*)
和L((a+*)
是彼此的子集,所以这些集合必须相等。也就是说,te表达式生成相同的语言,因此是等价的。所以没有区别,因为a+=a*-e,其中e是空字符串?