Regex 无法理解2-5个字母回文的正则表达式?

Regex 无法理解2-5个字母回文的正则表达式?,regex,Regex,我不熟悉正则表达式。我正在努力理解解释回文的代码。下面是表达式 \\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

我不熟悉正则表达式。我正在努力理解解释回文的代码。下面是表达式

\\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. 

回文可以有偶数或奇数个字母。当时间为偶数时,如“中午”,上半部分的所有字母都会重复。不带括号的可选
\\w?
用于不重复中间字母的奇数情况。也就是说,使用“kayak”时,y不会重复,因此以后不需要反向引用。

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

正则表达式在JavaScript中工作,因为如果相应的捕获组不匹配任何内容(未定义/null),JavaScript中的反向引用将匹配一个空字符串,而不是像在大多数情况下那样失败匹配

给定字符串
aba
,在JavaScript中:

  • (\w)?
    匹配空字符串。捕获组1未定义,因为我们在没有
    (\w)
    的情况下获取分支
  • (\w)
    匹配第一个
    a
    并将捕获组2设置为
    a
  • \w?
    匹配
    b
  • \2
    引用捕获组2并匹配
    a
  • \1
    匹配空字符串,因为未定义捕获组1
其他引擎只是在最后一步失败,因为当相应的捕获组未定义/null时,这些风格中的反向引用会使匹配失败

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

\b(\w?)(\w)\w?\2\1
     ^
通过将可选量词放入其中,捕获组1始终捕获某些内容(可以是单词字符或空字符串,但不能是未定义的/null)


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

顺便说一句,您的正则表达式是:
\b(\w)?(\w)\w?\2\1
。额外的反斜杠只是将正则表达式嵌入到任何语言中的一部分——可能是Java。@SteveBennett:它不适用于Java中的2和3字母回文。仅在JavaScript中。如果第一个
在捕获组内移动。它将在Java中工作。这是因为JavaScript中的
\1
匹配空字符串(如果未捕获任何内容),而Java(和许多其他风格)在这种情况下总是失败。哦,这是JavaScript吗?在这种情况下,您可以通过在正斜杠中表示正则表达式来简化操作:
/\b(\w)?(\w)\w?\2\1/
-这对您的问题没有帮助。:)目前,ideone和regexplanet在Perl上显示了这个正则表达式的奇怪结果。可能是个虫子。下面是指向我的要点的链接,显示了不同版本Perl上的不同结果: