忽略转义字符时拆分字符串

时间:2015-03-01 03:40:48

标签: java regex string

我想沿空格分割一个字符串,如果它们包含在单引号内则忽略空格,如果它们被转义则忽略单引号(即,\') 我从another question完成了以下内容。

    String s = "Some message I want to split 'but keeping this a\'s a single string' Voila!";
    for (String a : s.split(" (?=([^\']*\'[^\"]*\')*[^\']*$)")) {
        System.out.println(a);
    }

上述代码的输出是

Some
message
I
want
to
split
'but
keeping
this
'a's a single string'
Voila!

但是,如果它们被转义(\'),我需要忽略单引号,而上述情况并没有。此外,我需要删除第一个和最后一个单引号和正斜杠,当且仅当它(正斜杠)转出单引号时('this is a \'string'将变为this is a 'string)。我不知道如何使用正则表达式。我该如何做到这一点?

3 个答案:

答案 0 :(得分:3)

您需要使用负面反对来处理转义的单引号:

String str = 
        "Some message I want to split 'but keeping this a\\'s a single string' Voila!";

String[] toks = str.split( " +(?=((.*?(?<!\\\\)'){2})*[^']*$)" );
for (String tok: toks)
    System.out.printf("<%s>%n", tok);

<强>输出:

<Some>
<message>
<I>
<want>
<to>
<split>
<'but keeping this a\'s a single string'>
<Voila!>

PS:正如您所指出的,转义单引号需要在\\'分配中键入String,否则会被视为普通'

答案 1 :(得分:1)

或者您可以使用此模式捕获您想要的内容

('(?:[^']|(?!<\\\\)')*'|\S+)  

Demo

答案 2 :(得分:1)

真的过度思考这个。

这应该可行,最好的部分是它根本不使用外观(因此它几乎可以在regex实现中运行,最着名的是javascript)

('[^']*?(?:\\'[^']*?)*'|[^\s]+)

不使用拆分,而是使用匹配来使用此正则表达式构建数组。

我的目标是

  • 它可以辨别逃逸的撇号而不是(当然)
  • 速度很快。我之前写的那个庞然大物实际上花了时间
  • 它适用于多个子引用,这里提出了很多建议。

Demo

  • 测试字符串:辨别单引号的双重用途&#39;作为&#39;引用标记&#39;,比如&#34;,以及&#39; cotraction的标记。&#39;。

    如果你问作者并且他是以第三人的身份发言,他会说'CFQueryParam'的例子是人为的,他知道但是他有世界的理由。最困难的时候想一个例子。&#39;

    我希望分割一些消息,但要保持一个字符串&#39;瞧!

  • 结果: Discerning between 'the single quote\'s double purpose' as a 'quote marker' , ,< strong> like ", and a 'a cotraction\'s marker.' .

    If you asked the author and he {{1 was speaking in { {1}} the third person, he would

    say 'CFQueryParam\'s example is contrived, and he knew that but he had the world\'s most difficult time thinking up an example.' Some message I want to {{1 }}