正则表达式使用键/值对中的空格拆分字符串,而不是用引号括起来

时间:2013-10-27 09:05:17

标签: java regex split

我正在努力寻找正确的正则表达式来解析包含键/值对的字符串。 当没有用双引号括起来时,字符串应该在空格上分割。

示例字符串:

2013-10-26    15:16:38:011+0200 name="twitter-message" from_user="MyUser" in_reply_to="null" start_time="Sat Oct 26 15:16:21 CEST 2013" event_id="394090123278974976" text="Some text" retweet_count="1393"

所需的输出应为

2013-10-26
15:16:38:011+0200
name="twitter-message"
from_user="MyUser" 
in_reply_to="null" 
start_time="Sat Oct 26 15:16:21 CEST 2013" 
event_id="394090123278974976" 
text="Some text" 
retweet_count="1393"

我找到了这个答案让我接近理想的结果Regex for splitting a string using space when not surrounded by single or double quotes 正则表达式:

Matcher m = Pattern.compile("[^\\s\"']+|\"[^\"]*\"|'[^']*'").matcher(str);
        while (m.find())
            list.add(m.group());

这给出了一个列表:

2013-10-26
15:16:38:011+0200
name=
"twitter-message"
from_user=
"MyUser"
in_reply_to=
"null"
start_time=
"Sat Oct 26 15:16:21 CEST 2013"
event_id=
"394090123278974976"
text=
"Some text"
retweet_count=
"1393"

它在=符号上分裂,因此仍然缺少某些东西以获得所需的输出。

3 个答案:

答案 0 :(得分:0)

尝试:Matcher m = Pattern.compile("(?:[^\\s\"']|\"[^\"]*\"|'[^']*')+").matcher(str);

您的原始正则表达式可以理解为“匹配一系列非空白字符或带引号的字符串”。这个是“匹配一系列非空白字符或引用字符串”。

答案 1 :(得分:0)

尝试使用此

[^\\s=]+(=\"[^\"]+\")?
  • [^\\s=]+会找到不是空格的所有内容或=,因此start_time="Sat Oct 26 15:16:21 CEST 2013"它将匹配start_time部分。
  • (=\"[^\"]+\")?是可选的,它将与="zzz"部分匹配(其中z不能为"

示例

Matcher m = Pattern.compile("[^\\s=]+(=\"[^\"]+\")?").matcher(str);
while (m.find())
    System.out.println(m.group());

输出:

2013-10-26
15:16:38:011+0200
name="twitter-message"
from_user="MyUser"
in_reply_to="null"
start_time="Sat Oct 26 15:16:21 CEST 2013"
event_id="394090123278974976"
text="Some text"
retweet_count="1393"

答案 2 :(得分:0)

这应该适合你:

// if your string is str

// split on space if followed by even number of quotes
String[] arr = str.split(" +(?=(?:([^\"]*\"){2})*[^\"]*$)");
for (String s: arr)
   System.out.printf("%s%n", s);

<强>输出:

2013-10-26
15:16:38:011+0200
name="twitter-message"
from_user="MyUser" 
in_reply_to="null" 
start_time="Sat Oct 26 15:16:21 CEST 2013" 
event_id="394090123278974976" 
text="Some text" 
retweet_count="1393"