2012-08-08 20 views
0

我正在实现一个简单的正则表达式,我无法计算明星的行为。在正则表达式中的星的行为

假设a * b是我的搜索表达式。当它应用于目标文本aaaaaabbc和1345536时应该发生什么?

因为星号取零或更多的前一个字符,所以都必须通过。这不正确吗?这里的一个http://www.zytrax.com/tech/web/regex.htm表示它不是。

如果不是的话,那么如何让迭代停止?我觉得让它停止违反既定规则。

--------编辑

我之所以说必须连续工作,第二个是这样的。应该有零个或多个a,并且有零个a。随着时间的推移,信件用完了,而且b也没有机会与之比较。所以这不是一场比赛?

这就是我无法得到的,如何以及何时会得到一个机会?

+1

这是什么语言? – 2012-08-08 18:52:33

+0

另外,你是否试图匹配整个正则表达式,或者你在寻找一个submatch? – AlexLordThorsen 2012-08-08 18:54:49

+2

“1345536”里面没有“b”,所以不是,那个不匹配。 – Wiseguy 2012-08-08 18:54:52

回答

2

假设a * b是我的搜索表达式。当它应用于目标文本aaaaaabbc和1345536时应该发生什么?

随着aaaaaabbc,它开始尝试匹配第一个字符(一个a),认为是可以的,一直走,直到它到达第一b。此时它停止,宣告成功。 (有些语言添加隐全串在默认情况下锚定到正则表达式,但经典的可以在任何地方匹配。)

随着1345536,它尝试匹配的第一个字符,发现它不能(这是既不a也不b ),然后继续尝试第二个。由于它从未找到可以开始匹配的点,所以整个字符串不匹配。

我们也考虑一下aaac(你还没有使用过,但仍然有信息);虽然状态机发现a并开始尝试匹配,但由于它从来没有发现强制性b,它实际上从来没有实际完成匹配和字符串不匹配。

我说它必须为第二个工作的原因是这样的。应该有零个或多个a,并且有零个a。随着时间的推移,信件用完了,而且b也没有机会与之比较。所以这不是一场比赛?

这就是我无法得到的,如何以及何时会得到一个机会?

为了a*b匹配任何东西,它必须具有零角或多个a秒,然后强制b运行。是的,a是可选的,但b不是;它必须存在的比赛被发现。 1345536中没有b;它永远不会匹配。 RE引擎将首先寻找ab;要么会做。如果它找到a,则它将开始尝试匹配对a的扫描,直至到达b(匹配)或非b(和非a)(非匹配)。如果找到的第一个字符是b;该比赛立即被发现。

总之,你有些误解了a*b的含义。 a的可选项与b无关。

+0

啊!那就是这样。如果(a){只要a}否则检查b。谢谢。 – Dirt 2012-08-09 06:27:52

0

你没有说哪种语言,但是在大多数正则表达式实现中,星号代表“零个或多个前面的字符”,所以a*b将表示“零”或更多的'a'后跟'b'“ 。

因此,a*b应匹配第一个目标中的子串aaaaaab,但在第二个目标中应该不匹配。

+0

请检查编辑。 – Dirt 2012-08-08 20:05:04

1

在您给出的示例中,'1345536'字符串将不会与'a * b'匹配,因为它需要'b'。 这将匹配:

aaaaaaaaab 
aaaaaabc 
121435b 

的*符号的意思是0个或多个字符的话,因此,如果你把一个“B”上的任何地方,将被匹配之前,“一”只是用于获取匹配组:

test | Group 
1aab => aab 
ab => ab 
bab => b, ab 

编辑:

你想的方式是不行的,他们需要表现如何定期进行测试,以结束后,根据regular-expressions.info:“只有在所有可能性都被尝试并发现失败的情况下,发动机才会继续使用第二个角色。”

当您在1345536测试A * B,这是发生了什么(实际上没有这一点,但你的想法):

  • 检查的第一个字符
  • 它是一个 'A'?
  • Nope
  • 这是'b'吗?
  • 都能跟得上
  • 然后进入下一个字符

“B”得到他的机会就测试字符串中的字符的每一个

+0

请检查编辑。 – Dirt 2012-08-08 20:05:21

+0

那么明星扮演什么角色?它看起来更像是一个或多个。 – Dirt 2012-08-08 20:40:58

+0

如果是明星,它会按我的说法做,如果是加号,它会搜索'a',然后搜索'b',因为至少需要一个'a'来继续。 该字符串将不匹配,因为找不到'b',用排列测试直到结束。 – 2012-08-08 20:51:38

0

正则表达式与状态机是同构的。一旦你有了基本的想法,代码应该是显而易见的。计算理论中的任何基础课程都涵盖了这一点;或阅读Ken Thompson's original paper

+1

这并没有真正回答这个问题,是吗? – Almo 2012-08-08 19:46:00

+0

“这个答案的问题是OP *应该问的问题。”也许它应该是一个评论,但它当然是试图让OP甚至远程正确地实现解决问题的途径。 – tripleee 2012-08-09 03:31:46

相关问题