我正在尝试编写一个正则表达式来处理一串像这样格式化的键值对
KEY/VALUE KEY/VALUE VALUE KEY/VALUE
一个键可以有多个以空格分隔的值。
我想将键值匹配在一起,因此上面字符串的结果将是
VALUE
VALUE VALUE
VALUE
我目前有以下作为我的正则表达式
[A-Z0-9]+/([A-Z0-9 ]+)(?:(?!^[A-Z0-9]+/))
但是会返回
VALUE KEY
作为第一个结果。
答案 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()函数)。首先根据空间将字符串拆分为一个键/值项数组,然后遍历数组项,然后使用/再次拆分它们