key =(value)语法的正则表达式

时间:2014-08-18 06:45:58

标签: java regex

我目前正在编写一个带有正则表达式的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:numbervalue:abc(kk)123)+status(open
它应该是两对键值。

你们可以建议改善上面的表达吗?

4 个答案:

答案 0 :(得分:2)

根本不可能使用正则表达式,抱歉。如果你想计算开始和结束的parantheses,正则表达式通常不够好。您尝试解析的语言不是regular language

当然,可能有办法绕过这种限制。我们无法知道,如果你给我们的背景与你一样少。

答案 1 :(得分:1)

从索引1和2获取匹配的组

([a-zA-Z0-9]+)\((.*?)\)(?=\+|$)

这是online demo

以上正则表达式模式将)+视为键和值之间的分隔符。

注意:如果值包含)+,例如number(abc(kk)+123+4+4)+status(open)

,则上述正则表达式模式将无效

enter image description here

示例代码:

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)字段。