【问题标题】:Split string on spaces in Java, except if between quotes (i.e. treat \"hello world\" as one token) [duplicate]在 Java 中的空格上拆分字符串,除非在引号之间(即将 \"hello world\" 视为一个标记)[重复]
【发布时间】:2011-10-18 08:21:38
【问题描述】:

如何根据空格拆分String,但将带引号的子字符串视为一个单词?

例子:

Location "Welcome  to india" Bangalore Channai "IT city"  Mysore

它应该存储在ArrayList as

Location
Welcome to india
Bangalore
Channai
IT city
Mysore

【问题讨论】:

  • IMO 即使与重复链接的问题较旧,但 aioobe 的这个答案是两者中更好的,因为它具有用于提取匹配项的高级正则表达式配方。

标签: java


【解决方案1】:

方法如下:

String str = "Location \"Welcome  to india\" Bangalore " +
             "Channai \"IT city\"  Mysore";

List<String> list = new ArrayList<String>();
Matcher m = Pattern.compile("([^\"]\\S*|\".+?\")\\s*").matcher(str);
while (m.find())
    list.add(m.group(1)); // Add .replace("\"", "") to remove surrounding quotes.


System.out.println(list);

输出:

[Location, "Welcome  to india", Bangalore, Channai, "IT city", Mysore]

正则表达式只是说

  • [^"]     - 以 " 以外的其他内容开头的令牌
  • \S*       - 后跟零个或多个非空格字符
  • ...或...
  • ".+?"   - 一个"-符号,后面跟着一个符号,直到另一个"

【讨论】:

  • Location, "Welcome to india", Bangalore, Channai, "IT city", Mysore 这是我以 jsp 形式输入的一个字符串,提交后应该拆分,因为我在问题
  • 不应该有双引号
  • 啊,把m.group(1)改成m.group(1).replace("\"", "")
  • @Tema,这种担忧与"..." 分组(并且可以说是特定于应用程序的)正交。我强烈建议在处理字符串时使用String.trim,而不是让已经很复杂的正则表达式变得更加复杂。
  • 遗憾的是,它在内部引号中失败:'exec -s something -e "lala \"lo lo\" lulu" -f $file'。它也不适用于单引号。如何像 bash 这样的命令行解释器解析这样的字符串?
猜你喜欢
  • 2014-05-10
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 2012-10-16
  • 2011-12-14
  • 1970-01-01
相关资源
最近更新 更多