我目前正在编写一个带有正则表达式的java程序,但我很挣扎,因为我在正则表达式中很新。
KEY_EXPRESSION = "[a-zA-z0-9]+";
VALUE_EXPRESSION = "[a-zA-Z0-9\\*\\+,%_\\-!@#\\$\\^=<>\\.\\?';:\\|~`&\\{\\}\\[\\]/ ]*";
CHUNK_EXPRESSION = "(" + KEY_EXPRESSION + ")\\((" + VALUE_EXPRESSION + ")\\)";
目标语法为key(value)+key(value)+key(value)
。键是字母数字,值可以是任意组合。
到目前为止一切顺利。但是,我的'('
,')'
值存在问题。如果我在值中放置'('
或')'
,则值包括所有其余值。
e.g。 number(abc(kk)123)+status(open)
返回key:number
,value:abc(kk)123)+status(open
它应该是两对键值。
你们可以建议改善上面的表达吗?
答案 0 :(得分:2)
根本不可能使用正则表达式,抱歉。如果你想计算开始和结束的parantheses,正则表达式通常不够好。您尝试解析的语言不是regular language。
当然,可能有办法绕过这种限制。我们无法知道,如果你给我们的背景与你一样少。
答案 1 :(得分:1)
从索引1和2获取匹配的组
([a-zA-Z0-9]+)\((.*?)\)(?=\+|$)
以上正则表达式模式将)+
视为键和值之间的分隔符。
注意:如果值包含)+
,例如number(abc(kk)+123+4+4)+status(open)
示例代码:
String str = "number(abc(kk)123)+status(open)";
Pattern p = Pattern.compile("([a-zA-Z0-9]+)\\((.*?)\\)(?=\\+|$)");
Matcher m = p.matcher(str);
while (m.find()) {
System.out.println(m.group(1) + ":" + m.group(2));
}
输出:
number:abc(kk)123
status:open
答案 2 :(得分:1)
<击> 撞击>
<击>有人发布了一个有效工作解决方案正则表达式的答案:
([a-zA-z0-9]+)\((.*?)\)(?=\+|$)
- 效果很好。当我在在线正则表达式测试站点上测试并回来时,帖子已经消失了。是正确的解决方案吗?我想知道为什么答案已被删除。
看到这个高尔夫球的正则表达式:
([^\W_]+)\((.*?)\)(?![^+])
击> [^\W_]
代替[a-zA-Z0-9]
。(?![^+])
来匹配而无需回溯。
击> 但是,这不是一个实用的解决方案,因为内部元素中的)+
会破坏:number(abc(kk)+5+123+4+4)+status(open)
这种情况下,具有不支持递归的正则表达式实现的Java处于不利地位。正如我在this thread中提到的,实际的方法是使用变通方法(复制粘贴正则表达式),或构建自己的有限状态机来解析它。
此外,您的原始正则表达式中有印刷错误。 [a-zA-z0-9]+
的范围为&#34; A-z
&#34;。您打算输入&#34; A-Z
&#34;。
答案 3 :(得分:0)
我会做一点假设,你可以在你的大块末尾添加一个+
即number(abc(kk)123)+status(open)+
如果可能的话,你可以使用它:
KEY_EXPRESSION = "[a-zA-z0-9]+";
VALUE_EXPRESSION = "[a-zA-Z0-9\\*\\+,%_\\-!@#\\$\\^=<>\\.\\?';:\\|~`&\\{\\}\\[\\]\\(\\)/ ]*?";
CHUNK_EXPRESSION = "(" + KEY_EXPRESSION + ")\\((" + VALUE_EXPRESSION + ")\\)+";
更改在第2行,将(
)
与*
*?
?
关闭贪心匹配并尝试保持最短匹配(不情愿的操作员)。
在第3行,在掩码末尾添加+
,以帮助分隔key(value)
字段。