有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何为这些路径表达式编写正则表达式

我正在尝试编写一个助手方法,它可以分解路径表达式,并希望得到一些帮助。请考虑一个路径模式,如下面的四个(括号表示谓词):

  1. item.sub_element.subsubelement(@key = string);或者
  2. item..subsub_element(@key = string);或者
  3. //subsub_element(@key = string);或者
  4. item(@key = string)

与之匹配的正则表达式是什么样子的

我想到的是:

 ((/{2}?[\\w+_*])(\\([_=@#\\w+\\*\\(\\)\\{\\}\\[\\]]*\\))?\\.{0,2})+

我的理解是:“匹配由两组组成的字符串的一个或多个出现处:第一组由一个或多个带可选下划线和可选双正斜杠前缀的单词组成;第二组是可选的,至少由一个单词组成,所有其他字符都是可选的;组后面由0到2个点组成。”

但是,在第四个示例上使用Matcher运行了一个测试。matches()返回false。那么,我的错误在哪里

有什么想法吗

蒂亚

FK

编辑:通过尝试使用http://www.regexplanet.com/simple/index.html,我似乎没有意识到Matcher.matches()对象的Matcher.find()方法和Matcher对象的Matcher.find()方法之间的区别。我试图将输入字符串分解为与正则表达式匹配的子字符串。因此,我需要使用find(),而不是matches()

伊迪丝2:这就成功了

([a-zA-Z0-9_]+)\.{0,2}(\(.*\))?


共 (3) 个答案

  1. # 1 楼答案

    您可能会发现此网站对于测试正则表达式的http://www.fileformat.info/tool/regex.htm很有用

    作为一种通用方法,尝试从一个处理简单情况的正则表达式构建正则表达式,编写一些测试并使其通过。然后使正则表达式更加复杂,以处理其他情况。确保它通过了原始测试和新测试

  2. # 2 楼答案

    我想你误解了人物课。我发现,对于测试正则表达式,http://gskinner.com/RegExr/非常有帮助。作为正则表达式的教程,我推荐http://www.regular-expressions.info/tutorial.html

    我不完全确定,您希望如何对字符串进行分组。你的句子似乎暗示,你的第一组只是item..subsub_element(@key = string)item部分,但我不确定第二组应该是什么。根据我从正则表达式推断的结果,我将把括号前的部分归为第一组,括号中的部分归为第二组。如果我误解了你,你当然可以修改这个

    我没有对Java的表达式进行转义,所以您必须这样做

    第一组应该以可选的双斜杠开始。我用 (?://)?。这里?:意味着不应该捕获这个部分,最后一个?使它前面的组成为可选的

    接下来是包含字符和下划线的单词,它们按点分组。一个这样的单词(带尾随点)可以表示为[a-zA-Z_]+\.{0,2}。我认为,您使用的\w实际上是[a-zA-Z0-9_]的快捷方式。它不代表一个单词,而是一个“单词字符”

    最后一个表达式可能出现多次,因此第一个组的捕获表达式如下所示

    ((?://)?(?:[a-zA-Z_]+\.{0,2})+)
    

    对于括号中的部分,可以使用\([^)]*\),这意味着一个开始的括号(转义,因为它有特殊的含义,后面跟着任意数量的非括号(未转义,因为它在字符类中没有特殊的含义),然后是结束的括号

    结合^$分别标记行的开始和结束,我们得出

    ^((?://)?(?:[a-zA-Z_]+\.{0,2})+)(\([^)]*\))$
    

    如果我误解了您的要求,需要帮助,请在评论中询问

  3. # 3 楼答案

    你的模式有很多问题:

    /{2}?:你认为?在这里是什么意思?因为如果你认为它使/{2}成为可选的,那你就错了。相反?{2}重复的不情愿的修饰符。也许像(?:/{2})?这样的东西就是你想要的

    [\w+_*]:你认为这里的+*是什么意思?因为如果你认为它们代表重复,那你就错了。这是一个字符类定义,+*字面意思是字符+*。也许你打算。。。事实上,我不确定你的意图


    解决方案尝试

    下面是猜测您的规格的尝试:

        String PART_REGEX =
            "(word)(?:<<@(word) = (word)>>)?"
                .replace("word", "\\w+")
                .replace(" ", "\\s*")
                .replace("<<", "\\(")
                .replace(">>", "\\)");
        Pattern entirePattern = Pattern.compile(
            "(?://)?part(?:\\.{1,2}part)*"
                .replace("part", PART_REGEX)
        );
        Pattern partPattern = Pattern.compile(PART_REGEX);
    

    然后我们可以按如下方式进行测试:

        String[] tests = {
            "item.sub_element.subsubelement(@key = string)",
            "item..subsub_element(@key = string)",
            "//subsub_element(@key = string)",
            "item(@key = string)",
            "one.dot",
            "two..dots",
            "three...dots",
            "part1(@k1=v1)..part2(@k2=v2)",
            "whatisthis(@k=v1=v2)",
            "noslash",
            "/oneslash",
            "//twoslashes",
            "///threeslashes",
            "//multiple//double//slashes",
            "//multiple..double..dots",
            "..startingwithdots",
        };
        for (String test : tests) {
            System.out.println("[ " + test + " ]");
            if (entirePattern.matcher(test).matches()) {
                Matcher part = partPattern.matcher(test);
                while (part.find()) {
                    System.out.printf("  [%s](%s => %s)%n",
                        part.group(1),
                        part.group(2),
                        part.group(3)
                    );
                }
            }
        }
    

    上述印刷品:

    [ item.sub_element.subsubelement(@key = string) ]
      [item](null => null)
      [sub_element](null => null)
      [subsubelement](key => string)
    [ item..subsub_element(@key = string) ]
      [item](null => null)
      [subsub_element](key => string)
    [ //subsub_element(@key = string) ]
      [subsub_element](key => string)
    [ item(@key = string) ]
      [item](key => string)
    [ one.dot ]
      [one](null => null)
      [dot](null => null)
    [ two..dots ]
      [two](null => null)
      [dots](null => null)
    [ three...dots ]
    [ part1(@k1=v1)..part2(@k2=v2) ]
      [part1](k1 => v1)
      [part2](k2 => v2)
    [ whatisthis(@k=v1=v2) ]
    [ noslash ]
      [noslash](null => null)
    [ /oneslash ]
    [ //twoslashes ]
      [twoslashes](null => null)
    [ ///threeslashes ]
    [ //multiple//double//slashes ]
    [ //multiple..double..dots ]
      [multiple](null => null)
      [double](null => null)
      [dots](null => null)
    [ ..startingwithdots ]
    

    附件