用于处理键值对的正则表达式

时间:2011-11-29 01:45:37

标签: java regex

我正在尝试编写一个正则表达式来处理一串像这样格式化的键值对

KEY/VALUE KEY/VALUE VALUE KEY/VALUE

一个键可以有多个以空格分隔的值。

我想将键值匹配在一起,因此上面字符串的结果将是

VALUE
VALUE VALUE
VALUE

我目前有以下作为我的正则表达式

[A-Z0-9]+/([A-Z0-9 ]+)(?:(?!^[A-Z0-9]+/))

但是会返回

VALUE KEY 

作为第一个结果。

3 个答案:

答案 0 :(得分:2)

在您的否定前瞻声明中,将+更改为*;否则,你不会阻止匹配在/之前结束,你只是阻止它在一个跟随/的单词之前结束。另外,从负前瞻断言中删除^;它的意思是“字符串的开头”,所以在这种情况下永远不会匹配。离开:

[A-Z0-9]+/([A-Z0-9 ]+)(?![A-Z0-9]*/)

(我也删除了(?:...)符号,因为它在出现的上下文中没有效果。)

那就是说,一种稍微容易阅读的方法可能就是这样:

[A-Z0-9]+/([A-Z0-9 ]+)( |$)

要求值后跟一个空格(被吞下)或字符串结尾。由于密钥后跟/,因此会忽略它们。

答案 1 :(得分:1)

为何选择RegEx?

String input = "key/value key/value1 value2 key/value";

String[] pairs = input.split("/");

for(int i = 0; i < pairs.length; i += 2) {
    String key = pairs[0];
    String value = pairs[1];
    /* (Optionally)
        String[] values = value.split(" ");
    */
}

然而,如果你坚持,那我想是这样的:

([\w]+)/([\w ]+)(?![\w]*/)

是一个不错的选择,它允许您将关键组和值作为单独的组进行查找和捕获。它允许键和值名称中的下划线。如果您愿意,也可以在集合中添加连字符。

图片来源:Ruakh负责RegEx的大部分工作。我赞同他/她的回答。

答案 2 :(得分:0)

你最好使用某种字符串拆分(不是java程序员,但在php中有explode()函数)。首先根据空间将字符串拆分为一个键/值项数组,然后遍历数组项,然后使用/再次拆分它们