簡體   English   中英

StringTokenizer-如何忽略字符串中的空格

[英]StringTokenizer -How to ignore spaces within a string

我正在嘗試在以下單詞列表上使用stringtokenizer

String sentence=""Name":"jon" "location":"3333 abc street" "country":"usa"" etc

當我使用stringtokenizer並給空格作為定界符時,如下所示

StringTokenizer tokens=new StringTokenizer(sentence," ")

我期待我的輸出作為以下不同的令牌

Name:jon

location:3333 abc street

country:usa

但是字符串標記器也嘗試標記位置值,它看起來像

Name:jon

location:3333

abc

street

country:usa

請讓我知道如何解決上述問題,如果我需要做一個正則表達式,我應該指定哪種表達式?

使用CSV Reader可以輕松處理。

String str = "\"Name\":\"jon\" \"location\":\"3333 abc street\" \"country\":\"usa\"";

// prepare String for CSV parsing
CsvReader reader = CsvReader.parse(str.replaceAll("\" *: *\"", ":"));
reader.setDelimiter(' '); // use space a delimiter
reader.readRecord(); // read CSV record
for (int i=0; i<reader.getColumnCount(); i++) // loop thru columns
    System.out.printf("Scol[%d]: [%s]%n", i, reader.get(i));

更新:這是純Java SDK解決方案:

Pattern p = Pattern.compile("(.+?)(\\s+(?=(?:(?:[^\"]*\"){2})*[^\"]*$)|$)");
Matcher m = p.matcher(str);
for (int i=0; m.find(); i++)
    System.out.printf("Scol[%d]: [%s]%n", i, m.group(1).replace("\"", ""));

輸出:

Scol[0]: [Name:jon]
Scol[1]: [location:3333 abc street]
Scol[2]: [country:usa]

現場演示: http//ideone.com/WO0NK6

說明:根據OP的評論:

我正在使用此正則表達式:

(.+?)(\\s+(?=(?:(?:[^\"]*\"){2})*[^\"]*$)|$)

現在將其分解為較小的塊。

PS:DQ表示雙引號

(?:[^\"]*\")                    0 or more non-DQ characters followed by one DQ (RE1)
(?:[^\"]*\"){2}                 Exactly a pair of above RE1
(?:(?:[^\"]*\"){2})*            0 or more occurrences of pair of RE1
(?:(?:[^\"]*\"){2})*[^\"]*$     0 or more occurrences of pair of RE1 followed by 0 or more non-DQ characters followed by end of string (RE2)
(?=(?:(?:[^\"]*\"){2})*[^\"]*$) Positive lookahead of above RE2

.+?  Match 1 or more characters (? is for non-greedy matching)
\\s+ Should be followed by one or more spaces
(\\s+(?=RE2)|$) Should be followed by space or end of string

簡而言之:這意味着匹配任何字符1個或更多長度,后跟“空格或字符串結尾”。 空格后必須有偶數個DQ 因此,雙引號外的空格將被匹配,而雙引號內的空格將不被匹配(因為它們后面是奇數個DQ )。

StringTokenizer對於這項工作太簡單了。 如果您不需要在值中處理引號,則可以嘗試以下正則表達式:

String s = "\"Name\":\"jon\" \"location\":\"3333 abc street\" \"country\":\"usa\"";
Pattern p = Pattern.compile("\"([^\"]*)\"");
Matcher m = p.matcher(s);
while (m.find()) {
    System.out.println(m.group(1));
}

輸出:

名稱
喬恩
位置
3333 abc街
國家
美國

這將無法處理值內的內部引號-輸出應為例如

名稱:弗雷德(“弗雷迪”)瓊斯

您可以使用Json,看起來就像您在使用Json類型的架構。 做一點谷歌,並嘗試實現Json。

String sentence=""Name":"jon" "location":"3333 abc street" "country":"usa"" etc

將是鍵,Json中的值對(例如名稱)是鍵,而喬恩是值。 位置是關鍵,而3333 abc街是價值。 等等....

試試看。 這是一個鏈接http://www.mkyong.com/java/json-simple-example-read-and-write-json/

編輯:這只是一個愚蠢的答案,但是您可以嘗試這樣的事情,句子=句子.replaceAll(“ \\”“,” “); StringTokenizer tokens = new StringTokenizer(sentence,” “);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM