2016-08-07 38 views
1

我需要从该流中解析看起来像这样的代码行:command "string1" "string2"字符串可以包含空格和转义双引号。我需要分割它,以便获取命令,string1和string2作为数组元素。我认为分裂()与正则表达式匹配"但不是\".split("(?<!\\\\)\""))会做这项工作,但我听说这不是一个好主意。如何解析可包含转义双引号的双引号分隔字符串

有没有更好的方式在Java中做到这一点?

+5

这不是一个免费的写作服务。试一试。如果你无法使用它,请发布你已经完成的和发生了什么问题,我们会尽力帮助你。 –

+0

老实说,只是在空白处做一个拆分,然后分别解析命令参数。你不必乱用正则表达式 – Dici

+0

@Dici我不能分割空白,因为参数可以包含空格 – user1902247

回答

3

类似的东西应该做的伎俩,假设你要删除的外部双引号时适用(如果你不这样做,它只是一个改变第一捕获组的事项还包括引号):

public class Demo { 
    private static final Pattern WORD = 
     Pattern.compile("\"((?:[^\\\\\"]|\\\\.)*)\"|([^\\s\"]+)"); 

    public static void main(String[] args) { 
     String cmd = 
      "command "         + 
      "\"string with blanks\" "     + 
      "\"anotherStringBetweenQuotes\" "   + 
      "\"a string with \\\"escaped\\\" quotes\" " + 
      "stringWithoutBlanks"; 

     Matcher matcher = WORD.matcher(cmd); 
     while (matcher.find()) { 
      String capturedGroup = matcher.group(1) != null ? matcher.group(1) : matcher.group(2); 
      System.out.println("Matched: " + capturedGroup); 
     } 
    } 
} 

输出:

Matched: command 
Matched: string with blanks 
Matched: anotherStringBetweenQuotes 
Matched: a string with \"escaped\" quotes 
Matched: stringWithoutBlanks 

正则表达式是有点复杂,所以它还有一个值得位的解释:

  • [^\\\\\"]匹配的一切,但反斜线引号或双引号
  • \\\\.反斜杠后跟任何字符(包括双引号),即转义字符
  • (?:[^\\\\\"]|\\\\.)*匹配的逃脱或非转义字符的任何序列匹配,但没有捕获的组(因为(?:)
  • "\"((?:[^\\\\\"]|\\\\.)*)\"匹配裹入双引号任何这样的序列和捕获引号内
  • ([^\\s\"]+)匹配的非空白字符的任何非空序列,并捕获它的一组中
+0

感谢和抱歉打扰你,但是这种方法优于'str.split(“(?<!\\\\)\”)的优点是什么? '' – user1902247

+0

你不打扰我,我在这里回答问题,好处是正则表达式对我来说更加清晰了,如果你想分割,你的正则表达式必须描述分隔符,而我的正则表达式描述了你这也意味着我的正则表达式可以对输入进行一些检查,最后,我的方法可以延迟地匹配字符串,而不是为整个匹配分配一个数组,这将使得一点点不同在大多数情况下,但如果字符串非常大,它可能是一件好事 – Dici

+0

为什么downvote?请证明 – Dici

相关问题