[英]regular expression for key=(value) syntax
我目前正在编写一个带有正则表达式的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)
。 键是字母数字,并且值可以是任何组合。
到目前为止还可以。 但是,我对'('
, ')'
的值有疑问。 如果我在值中放置'('
或')'
,则值包括所有其余值。
例如number(abc(kk)123)+status(open)
返回key:number
, value:abc(kk)123)+status(open
应该是两对键值。
你们可以建议改善上面的表达方式吗?
从索引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
有人用有效的正则表达式发布了答案:([a-zA-z0-9]+)\\((.*?)\\)(?=\\+|$)
-这很好用。当我在在线正则表达式测试器网站上进行测试并返回时,该帖子已消失。这是正确的解决方案吗?我想知道为什么答案被删除了。
看到这个打高尔夫球的正则表达式:
([^\\W_]+)\\((.*?)\\)(?![^+])
[^\\W_]
代替[a-zA-Z0-9]
。 (?![^+])
进行匹配,而无需回溯。 但是,这不是实际的解决方案,因为内部元素中的)+
会损坏: number(abc(kk)+5+123+4+4)+status(open)
在这种情况下,具有不支持递归的正则表达式实现的Java处于不利地位。 正如我在该线程中提到的,实际的方法是使用替代方法(复制粘贴正则表达式),或者构建自己的有限状态机来解析它。
另外,您的原始正则表达式中存在印刷错误。 [a-zA-z0-9]+
的范围为“ Az
”。 您的意思是键入“ AZ
”。
我会做一个小小的假设,您可以在块的末尾添加一个+,即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)
字段。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.