Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 键值对的正则表达式,包括未替换的空格_Java_Regex_Parsing - Fatal编程技术网

Java 键值对的正则表达式,包括未替换的空格

Java 键值对的正则表达式,包括未替换的空格,java,regex,parsing,Java,Regex,Parsing,我需要一个正则表达式来解析属性文件中的键值对,以便将它们写入数据库。应用程序是用java编写的。由于我需要存储有关注释行和空行的信息,properties.load对我不起作用 在第一次出现未转义空格或等号(包括转义空格)之前,键是所有内容。 值是行结束前的所有内容,但也可以为空 它必须与以下情况相匹配: 键=值 关键值 键=值 钥匙 键值 key\key\key=value 键\键\键值 我尝试了以下正则表达式,但它不能正确区分最后两种情况: ^(\\\s|[^\s=]+)+[\s|=](

我需要一个正则表达式来解析属性文件中的键值对,以便将它们写入数据库。应用程序是用java编写的。由于我需要存储有关注释行和空行的信息,properties.load对我不起作用

在第一次出现未转义空格或等号(包括转义空格)之前,键是所有内容。 值是行结束前的所有内容,但也可以为空

它必须与以下情况相匹配:

  • 键=值
  • 关键值
  • 键=值
  • 钥匙
  • 键值
  • key\key\key=value
  • 键\键\键值
我尝试了以下正则表达式,但它不能正确区分最后两种情况:

^(\\\s|[^\s=]+)+[\s|=](.*)?$
最后两个例子是关于Rubular的:

1. key\
2. key\ key value
而不是

1. key\ key\ key
2. value
我也试过了,但对我也不起作用

提前感谢您的帮助

try(记住这是纯正则表达式,所以在将其编写为Java字符串时必须小心反斜杠转义):


在检查共享空间时,您希望使用反向查找
(?)

^((.*?)((?<!\\\\)\\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
(.*)将所有非贪婪项匹配到下一个匹配项
((?

使用工具在这里测试的每个案例

这个正则表达式只捕获密钥的最后一个字符。@Sebastian:对,很抱歉,我没有工具在这里测试,只是用我的大脑:)@Martijn:不,正如我所说,它是一个普通正则表达式,不在Java字符串中。你也可以使用
(*)(((?若要始终使用group#1获取键,使用group#4获取值。除非确实需要匹配字符串的开头/结尾,否则可以将其忽略,因为
Matcher.matches()
将匹配整个字符串。@Dan Cruz非常好的简化-您应该将其添加为您自己的答案,并为此获得一些积分。@cordsen适时地注意到并感谢您的建议。我确实觉得您应该得到这个答案的积分;您在我之前发布了它,我提供的只是一个小小的调整。
(.*?)             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