2

我正在尝试将这个正则表达式翻译成 Java:

^(\s*([<>]=?)?\s*!?(?:(2)[0-9]{1,5}|[0-9\*]{1,5})\s*(&|$))*

我当然知道不支持条件。直接翻译会导致异常。因此,我想了解如何解决问题。

谢谢,

4

1 回答 1

2

首先,我认为您的模式中有一个错误:

^(\s*([<>]=?)?\s*!?(?:(2)[0-9]{1,5}|[0-9\*]{1,5})\s*(&|$))*

您的第 2 组测试前似乎有一个冒号,这不会做您想要的。那将需要是:

^(\s*([<>]=?)?\s*!?(?(2)[0-9]{1,5}|[0-9\*]{1,5})\s*(&|$))*

但是还有其他一些奇怪的东西对我来说没有多大意义。我将在 mode 中重写您的模式,(?x)以便我们可以解开它并尝试理解它。哦,我会在你的条件语句的 or 分支中去掉那个多余的反斜杠[0-9\*],因为它应该是 just [0-9*]

这产生了这个:

(?x)                       # enable comments and whitespace
^                          # anchor to beginning of string
(                          # begin GROUP #1 {
    \s *                   #     any amount of whitespace, including none
    (                      #     begin GROUP #2 {
        [<>]               #        exactly one of either kind of pointy bracket
        = ?                #        optional equals sign
    ) ?                    #     } end GROUP #2, make optional
    \s *                   #     any amount of whitespace, including none
    ! ?                    #     optional exclamation point
    (?(2)                  #     if GROUP#2 is defined {
          [0-9]   {1,5}    #         then: 1-5× ASCII digits
     |    [0-9*]  {1,5}    #         else: 1-5× of either star or ASCII digit
    )                      #     } end ifdef GROUP#2
    \s *                   #     any amount of whitespace, including none
    (                      #     begin GROUP#3 {
        &                  #        either:  an ampersand
      | $                  #        or else: end of string
    )                      #     } end GROUP#3
) *                        # } end GROUP #1, make optional but allow repeats

据我所知,这就是你真正想要做的。你为什么这样做,我不知道,因为那里有些东西看起来很奇怪。

例如,为什么将重复运算符应用于第一个捕获组?它不会包含所有的重复,只有最后一个。

另一个问题是为什么允许第一组的零重复?就像 *所有可能的字符串都与 pattern 匹配 一样^a*,所有可能的字符串也与您的 pattern 匹配。这似乎不太有用。

最后,在结尾处有一个&符号字符串结尾是非常奇怪的。

如果原始发帖人能阐明他的意图,我会将其翻译成适用于 Java 正则表达式的东西,它不支持您在此处使用的条件构造,Perl、PHP、PCRE 和 C ♯</sup> 全部支持但不支持Java。(无论如何,这是从什么语言产生的?)您必须这样做的方法是使用或分支展开条件,其中涵盖了两种情况。

我对整个模式有点怀疑,因为它似乎不明智。一些应该匹配的示例输入将不胜感激。

我不能足够强调的一件事是/x,我提供的正则表达式的扩展版本是你应该永远写这些东西的唯一方法。没有空格、缩进、逻辑组和注释的乱码是完全不能接受的。像这样的事情永远不应该通过代码审查。他们是可憎的。

他们不必如此。我恳求您始终始终将/x模式用于任何长度和复杂性非平凡的正则表达式,例如这个。试着想想那些会追随你的人,希望在他们这样做之前。

最后,我想知道为什么它使用编号组而不是更容易记忆的命名组,后者更健壮。此外,Java 7 最终支持命名组,因此您不必在此妥协。

于 2012-06-04T02:58:40.217 回答