2

キーと値のペアを含む文字列を解析するための正しい正規表現を見つけるのに苦労しています。二重引用符で囲まれていない場合、文字列はスペースで分割する必要があります。

文字列の例:

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"

正規表現で一重引用符または二重引用符で囲まれていない場合に、スペースを使用して文字列を分割するための望ましい結果の 正規表現に近づけるために、この回答を見つけました 。

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"

= 記号で分割されているため、目的の出力に到達するにはまだ何かが欠けています。

4

3 に答える 3

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"
于 2013-10-27T09:33:36.650 に答える
0

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

元の正規表現は、「一連の非空白文字または引用符で囲まれた文字列に一致する」と理解できます。これは「一連の非空白文字または引用符付き文字列に一致する」です。

于 2013-10-27T09:17:27.813 に答える
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"
于 2013-10-27T09:24:50.457 に答える