相关疑难解决方法(0)

这个Java正则表达式如何检测回文?

这是一系列教育正则表达式文章的第三部分.它遵循这个正则表达式如何找到三角形数字?(首先介绍嵌套引用)和如何将^ nb ^ n与Java正则表达式匹配? (前瞻性"计数"机制进一步详述).这部分介绍了一种特定形式的嵌套断言,当与嵌套引用结合使用时,Java正则表达式可以匹配大多数人认为"不可能"的东西:回文!

回文的语言是非常规的 ; 它实际上是无上下文的(对于给定的字母表).也就是说,现代正则表达式实现不仅仅识别常规语言,Perl/PCRE的递归模式和.NET的平衡组可以很容易地识别回文(参见:相关问题).

但是,Java的正则表达式引擎既不支持这些"高级"功能.然而"某人" (*wink*)成功编写了以下正则表达式,这似乎做得很好(参见ideone.com):

public class Palindrome {
    // asserts that the entirety of the string matches the given pattern
    static String assertEntirety(String pattern) {
        return "(?<=(?=^pattern$).*)".replace("pattern", pattern);
    }

    public static void main(String[] args) {
        final String PALINDROME =
            "(?x) | (?:(.) add)+ chk"
                .replace("add", assertEntirety(".*? (\\1 \\2?)"))
                .replace("chk", assertEntirety("\\2"));

        System.out.println(PALINDROME);
        // (?x) | (?:(.) (?<=(?=^.*? (\1 \2?)$).*))+ (?<=(?=^\2$).*)

        String[] tests …
Run Code Online (Sandbox Code Playgroud)

java regex palindrome lookaround nested-reference

21
推荐指数
1
解决办法
5555
查看次数

这种PCRE模式如何检测回文?

这个问题是在PCRE模式中使用前瞻,嵌套引用和条件来匹配所有回文的教育演示,包括PCRE手册页中给出的递归模式无法匹配的回文.

在PHP代码段中检查此PCRE模式:

$palindrome = '/(?x)
^
  (?:
      (.) (?=
              .*
              (
                \1
                (?(2) \2 | )
              )
              $
          )
  )*
  .?
  \2?
$


/';
Run Code Online (Sandbox Code Playgroud)

这种模式似乎可以检测到回文,如本测试案例所示(另见ideone.com):

$tests = array(
  # palindromes
  '',
  'a',
  'aa',
  'aaa',
  'aba',
  'aaaa',
  'abba',
  'aaaaa',
  'abcba',
  'ababa',

  # non-palindromes
  'aab',
  'abab',
  'xyz',
);

foreach ($tests as $test) {
  echo sprintf("%s '%s'\n", preg_match($palindrome, $test), $test);  
}
Run Code Online (Sandbox Code Playgroud)

那么这种模式如何运作?


笔记

此模式使用嵌套引用,这是此Java正则表达式如何检测回文中使用的类似技术,但与Java模式不同,没有外观(但确实使用了条件).

另请注意,PCRE 手册页提供了一个递归模式以匹配一些回文:

# the recursive pattern to detect …
Run Code Online (Sandbox Code Playgroud)

php regex pcre palindrome nested-reference

20
推荐指数
1
解决办法
1350
查看次数

如何使用正则表达式创建循环?

老实说,我认为我应该先问一下这个问题的语法帮助.

但是,如果你能理解我的意思,请用适当的编辑标题.

有没有办法制作可以分割这样的文字的模式.

{{START}}
    {{START}}
        {{START}}
            {{START}}
            {{END}}
        {{END}}
    {{END}}
{{END}}
Run Code Online (Sandbox Code Playgroud)

因此,{{START}}每个{{END}}都会从第一个内部到外部最后一个匹配{{END}}!

如果我不能只用正则表达式做到这一点.用PHP做这件事怎么样?

先谢谢你了.

php regex

5
推荐指数
1
解决办法
1277
查看次数

标签 统计

regex ×3

nested-reference ×2

palindrome ×2

php ×2

java ×1

lookaround ×1

pcre ×1