如何确定正则表达式描述的语言中的有效字符串?

时间:2018-12-16 01:20:10

标签: regex

我无法理解如何为给定的正则表达式确定有效的字符串。自提供答案键以来,我就知道答案了,但是没有任何解释,如果有人可以解释如何确定以下答案,我将不胜感激:

使用以下每个正则表达式描述的语言提供有效的字符串,字母∑ = {0,1,2}。

(a)0(010)* 1

answer:01,00101,00100101,00100100100101

(b)(21∪10)* 0012

answer:001,001222,21001,10001,210012,2121001222,102121001

(c)1 *(200)*∪100 * 01

answer:1,200,111,11200200,111200200200,1001,1000001,10000001

谢谢!

1 个答案:

答案 0 :(得分:1)

首先,这个问题与regular expressions in the formal language theory有关,而不是与软件开发中使用的正则表达式有关(后者是用于字符串搜索的模式,这是基于定义的概念的实际软件实现)前者)。

在您的问题中,正则表达式是对与该表达式匹配匹配的一组字符串的描述。字符012相互匹配,而*字符表示前一个字符或一组字符(在括号中)可以重复0次或更多次,并且字符是联合运算符。

鉴于此,我们看到正则表达式0*匹配一个空字符串和以下字符串:000000等。类似地,{{1 }}匹配一个空字符串(0 ∪ 1)*01000110等-基本上,任何字符串由110构建。正则表达式1匹配所有以1零开头,然后是一个或多个1并以2结尾(例如01*202012等)的字符串。 / p>

基于此,您可以将第一个示例中的正则表达式翻译为英语,即“以0112开头的字符串,然后是出现零次或多次的一组三位数字0 ,后跟010',因此所有给定的答案都匹配。但是在第二个示例中,只有1与正则表达式匹配,所有其他答案均不匹配(或者您可能最终错过了210012:如果正则表达式为*,则答案将立即变得更有意义)。我将为您留出第三个例子。

请注意,在所有三种情况下,还有更多与给定表达式匹配的字符串,而不仅仅是在答案中给出的字符串。