2017-08-17 189 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