正则表达式匹配键值对,包括未转义的空格

5
我需要一个正则表达式来从属性文件中解析键值对并将它们写入数据库。这个应用程序是用Java编写的。由于我需要存储有关注释行和空行的信息,因此properties.load对我不起作用。
键是直到出现未转义的空格或等号(包括转义空格)的第一次出现为止的所有内容。 值是直到行末的所有内容,但也可以为空。
它必须匹配以下情况:
- key=value - key value - key=value value - key - key value value - key\ key\ key=value - key\ key\ key value 我尝试了以下正则表达式,但它无法正确分离最后两种情况:
^(\\\s|[^\s=]+)+[\s|=](.*)?$

对于我在Rubular上得到的最后两个例子:

1. key\
2. key\ key value

替代

1. key\ key\ key
2. value

我也尝试了这个,但对我来说也不起作用。
提前感谢您的帮助!
2个回答

2
你想要在检查空格时使用负回顾后断言 (?<!\\\\)\s
^((.*?)((?<!\\\\)\\s|=)(.*?)|(\\w+))$

分解它
(.*?)             Match everything non greedy up to the next match
((?<!\\\\)\\s|=)  Match witespace not preceded by \\
(.*?)             Again match everything non greedy up to the next match
|\\w+             Or match strings with no whitespace - this captures case 3 with no value

每个案例都使用此工具进行测试:http://www.cis.upenn.edu/~matuszek/General/RegexTester/regex-tester.html


1
你也可以使用 (.*?)(((?<!\\\\)\\s|=)(.*?))? 来一致地使用第一组获取键和第四组获取值。除非你真的需要匹配字符串的开头/结尾,否则可以省略它们,因为 Matcher.matches() 将匹配整个字符串。 - Go Dan
@Dan-Cruz 很好的简化 - 你应该将其作为自己的答案添加并获得一些荣誉。 - cordsen
@cordsen 已经注意到了,感谢您的建议。我认为您应该得到这个答案的功劳;您比我先发布了它,而我所提供的只是一个小调整。 - Go Dan

0

尝试使用正则表达式(请记住这是普通的正则表达式,因此在将其编写为Java字符串时必须注意反斜杠转义):

^(\\\s|[^\s=])+(.*)$

这个正则表达式只捕获键的最后一个字符。 - Sebastian
@Sebastian:没错,对不起啊,我这里没有工具可以测试,只能靠我的大脑 :) - LeleDumbo
1
@Martijn:不是的,正如我所说,它是一个普通的正则表达式,而不是在Java字符串中。 - LeleDumbo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接