2

我尝试使用 java 解析规则并使用 RegEx 读取内部的任何内容,但是由于我对 RegEx 非常陌生,因此发现了几个问题。

首先,我尝试用这个RegEx解析一个谓词(我不知道这是否太复杂):,"([a-zA-Z]+)\\(([\\?]?[a-zA-Z0-9]+)?(,[\\?]?[a-zA-Z0-9]+)*\\)"我刚刚发现这是完全错误的......谓词应该是这样的(我懒得写出完整的表达式), p(), p(?a), p(?a,?b,c,?d). 谓词名称必须是字符串(仅包含字母字符),参数是仅包含字母字符或以 开头的字符串?

我发现这里有两个问题,给定元素p(a,b,c)

  1. 当我循环查看每个组的元素(使用Matcher)时,结果只有p(a,b,c)pa,c,我怎么能检索b也?
  2. 如何不包括,组内的(逗号符号),注意重复也应该包括它?

另一种情况,当我输入时p(),为什么它会得到一个元素所在的组null

知道如何解决这个问题吗?

4

3 回答 3

1

您最长的示例字符串中的“arg”值之一是?b?,它似乎与您的描述不匹配。删除它,您的正则表达式匹配所有样本,但这仍然给您留下提取单个参数的问题。在 Java 中做到这一点的最简单方法是将所有参数捕获为一个字符串,然后拆分该字符串以分解各个参数。

正如@Tomalak 所说,您的正则表达式非常好;我唯一能看到的错误是在?代表第一个参数的组之后。它应该控制整个参数字符串,而不仅仅是第一个参数。我的意思是,如果没有第一个论点,那么寻找第二个、第三个等就没有意义了,是吗?这是我的做法:

(?:[?]?[a-zA-Z0-9]+(?:,[?]?[a-zA-Z0-9]+)*)?

这将不匹配任何内容,或者一个参数,或者几个用逗号分隔的参数,但它不会匹配(例如),aor ,?a,b,就像你的正则表达式那样。这是 Java 字符串文字形式的完整正则表达式:

"([a-zA-Z]+)\\(((?:\\??[a-zA-Z0-9]+(?:,\\??[a-zA-Z0-9]+)*)?)\\)"

谓词名称在组 #1 中捕获,参数在组 #2 中捕获。如果没有参数,组 #2 将包含一个空字符串(不是 a null)。否则,您可以通过用逗号分隔单个参数来拆分它。

顺便说一句,您可以使用反斜杠 ( \?) 或方括号 ( [?]) 转义大多数元字符;你不需要两者都做。如果它只是一个字符(即,不是真正的字符类的一部分,例如[!.?]),我建议使用反斜杠。我知道它在 Java 中的字符数相同,但我认为反斜杠使它更具自我记录性。


编辑:这是我使用的代码:

String[] inputs = { "p()", "p(?a)", "p(?a,?b,c,?d)", "p(a,b,c)" };
Pattern p = Pattern.compile(
    "([a-zA-Z]+)\\(((?:\\??[a-zA-Z0-9]+(?:,\\??[a-zA-Z0-9]+)*)?)\\)");

for ( String s : inputs )
{
  Matcher m = p.matcher(s);
  if ( m.matches() )
  {
    System.out.printf("%nFull match: %s%nPredicate name:%n  %s%n",
                      m.group(), m.group(1));
    String allArgs = m.group(2);
    if (allArgs.length() == 0)
    {
      System.out.println("No arguments");
    }
    else
    {
      System.out.println("Arguments:");
      for (String arg : allArgs.split(","))
      {
        System.out.printf("  %s%n", arg);
      }
    }
  }
}
于 2011-06-13T02:30:17.973 回答
0

“谓词应该是这样的(我懒得写完整的表达式),p(),p(?a),p(?a,?b?,c,?d)。”

我想添加评论,但 ie6 给我带来了麻烦。如果你给出更好的解释,我会给你一个解决方案。

您正在处理的是文本!不要试图把它粉饰成更奢侈的东西。
“懒惰”并不能解释什么p(), p(?a), p(?a,?b?,c,?d)意思。必须充分理解每一个文本字符/符号。
正则表达式功能强大,可能非常令人生畏。无法从抽象中
推断出正则表达式公式(抽象)。

对不起,我只是无法理解参数。我要删除我的帖子...
(显然,我无法删除它。如果有人可以帮我删除它,谢谢!)

于 2011-06-13T00:07:47.270 回答
0

我发现这里有两个问题,给定元素 p(a,b,c)

  1. 你不能(很容易)用正则表达式做这样的事情。(在 Perl 中,您可以使用一些技巧来做到这一点。)
  2. 有类似的东西(?:,(\w+))

另一种情况,当我输入 p() 时,为什么会得到一个元素为 null 的组?

因为应该匹配“参数”的组根本不匹配,因此没有定义。这就是捕获组的工作方式。比赛结束后,您可以根据需要选择/过滤抱怨。

您想为此使用/构造一个适当的解析器,而不仅仅是使用一个正则表达式。

于 2011-06-12T22:39:36.277 回答