2017-08-17 191 views
0

我需要我的字符串分割成3個ARGS每個ARG是什麼引號內,並將它們存儲在不同的變量。拆分Java字符串加上引號到ARGS不帶引號

這是我的。下面的代碼採用所有命令行參數並將它們組合成一個大的String。字符串的

例子我需要轉換:

「METRO Blue Line」 「Target Field Station Platform 1」 「south」 

它應該成爲:

var1 = METRO Blue Line 
var2 = Target Field Station Platform 1 
var3 = south 

我已經嘗試了很多與split("\"")但不管出於什麼原因,它甚至不刪除爲我報價。

// Construct a string to hold the whole args. 
// Implemented it this way because args is separated by spaces 
String combine = ""; 
for(int i = 0; i < args.length; i++) 
{ 
    combine = combine.concat(args[i]); 
    combine = combine.concat(" "); 
} 
System.out.println(combine); 
+0

貴'字符串'包含精明的引號? –

+0

@ Runesr4nerds如果用戶回答您的問題,請接受他的回答([接受答案:它是如何工作的?](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-工作))。如果不是,請說明還沒有答案,這是StackOverflow非常重要的一部分,非常感謝。 – Zabuza

回答

1

您正在使用彎曲引號(又名智能引號)的標記和不佔它在代碼

Pattern pattern = Pattern.compile("[「」]"); 
    String text = "「METRO Blue Line」 「Target Field Station Platform 1」 「south」 "; 
    String arr[] = text.split("\\」"); 
    for (int i = 0; i < arr.length; i++) { 
     System.out.println(pattern.matcher(arr[i]).replaceAll("").trim()); 
    } 
+1

雙'replaceAll'在這裏是不必要的,並且會增加開銷(特別是如果OP想要在大數據集上使用該代碼)。該方法接受**正則表達式**,並且由於您的操作對於兩個引號都是相同的,所以您可以簡單地使用replaceAll(「[」「]」,「」)'。也不需要轉義,這些都不是正則表達式的特殊符號。但仍然有用的答案,特別緊湊。 – Zabuza

+1

好點@Zabuza。還添加了另一個優化,以避免在每次迭代中重新編譯正則表達式。 –

1

符號是分配給符號"不同。如果您與split("\"")分開,那麼顯然您會搜索",但不能用於其他報價符號

您可以使用Matcher及其find方法輕鬆提取它們。或者,也可以使用正確分隔符split("」 「")的分割方法。請注意,第一個和最後一個元素將有一個單引號,只是刪除它。


String input = "「METRO Blue Line」 「Target Field Station Platform 1」 「south」"; 
String[] elements = input.split("」 「"); 

// Remove first quote 
elements[0] = elements[0].substring(1); 
// Remove last quote 
String lastElement = elements[elements.length - 1]; 
elements[elements.length - 1] = lastElement.substring(0, lastElement.length() - 1); 

// Output all results 
for (String element : elements) { 
    System.out.println(element); 
} 

輸出是:

METRO Blue Line 
Target Field Station Platform 1 
south 

這種方法的優點是,它是非常有效的,沒有多餘的更換或類似的東西,只是一個迭代在輸入,僅此而已。

+0

這裏假設報價的確切位置。在開始,結束或引用部分之間的任何額外空白都會導致失敗。 – slipperyseal

+0

這是正確的,你提到OP是好的。這個問題可以通過使用String#trim方法和簡單的拆分模式(如split(「」\\ s *「」))來輕鬆避免。否則OP應該可能提供更多示例輸入。 – Zabuza

+0

是的,這取決於輸入來自何處。它可能預計將被嚴格格式化。但如果它像命令行參數那樣,則在格式化時必須更加寬鬆。 – slipperyseal

0

爲了與原始答案的RegEx主題保持一致,我重寫了我的答案,以查找正常報價或智能報價。

String text = "「METRO Blue Line」 「Target Field Station Platform 1」 「south」"; 

String regex = "\"([^\"]*)\"|「([^」]*)」"; 

ArrayList<String> listOfStrings = new ArrayList<>(); 

Matcher m = Pattern.compile(regex).matcher(text); 
while (m.find()) { 
    if (m.group(1) != null) { 
     listOfStrings.add(m.group(1)); 
    } 
    if (m.group(2) != null) { 
     listOfStrings.add(m.group(2)); 
    } 
} 
for (String temp : listOfStrings) { 
    System.out.println(temp); 
} 
+0

請注意,OP的輸入沒有''',而是''''和'''(智能引號)。這些是不同的符號,因此你的代碼不能用於OP特定的輸入,但是我喜歡你顯示'Matcher#find'的方法 – Zabuza

0

可以從Java 8的代碼示例使用的string.join()

String[] strArray = { "How", "To", "Do", "In", "Java" }; 
String joinedString = String.join(", ", strArray);System.out.println(joinedString); 

輸出:

如何,要,執行,在,爪哇

+0

我認爲OP的問題是相反的,他需要將完整的字符串分割成幾部分。 – Zabuza