无法理解2-5 Letter Palindrome的正则表达式?

时间:2015-06-30 01:25:29

标签: regex

我是正则表达式的新手。我正在尝试理解解释palindrome的代码。发布的是表达式

\\b(\\w)?(\\w)\\w?\\2\\1

此表达式匹配

my "dad" "sees" a "kayak" at "noon"

我有点直觉......就像

\\b -ensures that you are at the beginning of the sentence.

\\w -ensures that it is a word character and it is captured into group1
     ? does it make (\\w) optional ..because i read some where that if you 
     put '?' in front of a token,it makes the token optional ex:https? will   
     match "http" as well
\\2 - for matching the second group
\\1 -  for matching the first..

  what bothers me is "(\\w)\\w?" which is making me difficult to understand 
  the expression.Any help will be appreciated. 

2 个答案:

答案 0 :(得分:2)

回文可以有偶数或奇数字母。当它是偶数时,比如"中午",重复上半部分的所有字母。没有括号的可选\\w?用于奇数情况,其中中间字母不重复。即用"皮划艇" y不重复,因此以后不需要反向引用。

答案 1 :(得分:0)

上面的正则表达式只能在宣传的JavaScript中使用(2-5个字符的回文前缀)。
在Java,Ruby,Python,PCRE,Perl(可能还有许多其他版本)中,正则表达式只匹配4-5个字符的回文前缀。

正则表达式适用于JavaScript,因为如果相应的捕获组与任何内容不匹配(未定义/ null),则JavaScript中的反向引用匹配空字符串,而不是像大多数风格的情况那样使匹配失败。

在JavaScript中给出字符串aba

  • (\w)?匹配空字符串。捕获组1是未定义的,因为我们在没有(\w)的情况下使用分支。
  • (\w)与第一个a匹配,并将捕获组2设置为a
  • \w?匹配b
  • \2引用捕获第2组并匹配a
  • \1匹配空字符串,因为捕获组1未定义。

其他引擎在最后一步失败,因为当相应的捕获组未定义/为null时,这些风格的反向引用会使匹配失败。

为了使正则表达式适用于上面列出的任何引擎中的2-5个字符回文前缀,您只需稍作修改:

\b(\w?)(\w)\w?\2\1
     ^

通过将可选的量词放在里面,捕获组1总是捕获的东西(可以是单词字符或空字符串,但不是undefined / null)。

给定输入aba,第一个捕获组现在捕获一个空字符串,因此\1匹配一个空字符串,并且匹配在上面列出的任何引擎上成功。