繁体   English   中英

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

[英]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:numbervalue: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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM