如何解决重复分析并取正则表达式以进行正则表达式
|| 我尝试使用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)
,我发现这里有两个问题:
当我循环查看每个组的元素时(使用Matcher
),结果只有p(a,c)
,p
,a
和,c
,我又如何检索b
?
如何在组中不包括,
(逗号),请注意重复项也应包括该字符?
另一种情况,当我输入p()
时,为什么会得到一个元素为null
的组?
任何想法如何解决这个问题?
解决方法
最长的示例字符串中的\“ arg \”值之一是
?b?
,似乎与您的描述不符。删除它,并且您的正则表达式与所有示例匹配,但是仍然存在提取单个参数的问题。在Java中,最简单的方法是将所有参数捕获为一个字符串,然后拆分该字符串以分解出各个参数。
正如@Tomalak所说,您的正则表达式非常好;我唯一看到的错误是代表第一个参数的组之后的ѭ2。它应该控制整个参数字符串,而不仅仅是第一个参数。我的意思是,如果没有第一个参数,就没有意义要寻找第二个,第三个,等等。这是我的处理方式:
(?:[?]?[a-zA-Z0-9]+(?:,[?]?[a-zA-Z0-9]+)*)?
这将不匹配任何内容,或者不匹配一个参数,或者不匹配多个以逗号分隔的参数,但不会匹配(例如),a
或,?a,b
,就像您的正则表达式一样。这是Java字符串文字形式的完整正则表达式:
\"([a-zA-Z]+)\\\\(((?:\\\\??[a-zA-Z0-9]+(?:,\\\\??[a-zA-Z0-9]+)*)?)\\\\)\"
谓词名称在组#1中捕获,参数在组#2中捕获。如果没有参数,则组2将包含一个空字符串(不是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);
}
}
}
}
,
给定元素p(a,b,c),我发现这里有两个问题
您无法(轻松)使用正则表达式执行此类操作。 (在Perl中,您可以使用一些技巧来做到这一点。)
像(?:,(\\w+))
另一种情况,当我输入p()时,为什么会得到其中元素为null的组?
因为应该匹配“参数”的组根本不匹配,因此未定义。这就是捕获组的工作方式。比赛结束后,您可以随时选择/过滤抱怨声。
您想为此使用/构造一个适当的解析器,而不仅仅是使用一个正则表达式。
, \“谓词应该是这样的(我懒得写完整的表达式),p(),p(?a),p(?a,?b?,c,?d)。”
我想添加评论,但ie6给我带来麻烦。如果您提供更好的解释,我会给您解决方案。
您正在处理的是文本!不要尝试将其粉饰为更奢侈的东西。
“懒惰”并不能解释ѭ25的含义。每个单独的文字字符/符号都必须完全理解。
正则表达式功能强大且可能令人生畏。正则表达式(抽象)不能为
从抽象推断。
抱歉,我无法理解参数。我要删除我的帖子...
(显然,我无法删除它。如果有人可以为我删除它,谢谢!)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。