我是正则表达式的新手。我正在尝试理解解释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.
答案 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
匹配一个空字符串,并且匹配在上面列出的任何引擎上成功。