Java - 基于空格和单引号拆分字符串但忽略两个单引号

时间:2014-08-18 09:31:10

标签: java regex

我想使用空格和单引号拆分字符串。但是应该忽略两个单引号。

输入:

name eq 'a''b'

输出应为:

name

eq

a''b

我尝试使用

[^\\s\"(?<!')'(?!')]+|\"[^\"]*\"|(?<!')'(?!')[^(?<!')'(?!')]*(?<!')'(?!')"

但它不起作用。

5 个答案:

答案 0 :(得分:3)

以下内容应符合您的需求:

'(?:[^']|'')+'|[^ ]+

Regular expression visualization

Debuggex Demo


Java示例:

String input = "foobar foo bar 'foobar' 'foo bar' 'foo''bar'";
Pattern pattern = Pattern.compile("'(?:[^']|'')+'|[^ ]+");
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
    String match = matcher.group();
    System.out.println(match);
}

Ideone Demo

答案 1 :(得分:1)

嗨,实际的正则表达式是

"\\s|(?<!')'(?!')"

它产生如下输出数组

[name, eq, , a''b]

答案 2 :(得分:0)

这也可以在没有regex的情况下完成。

String s = "name eq 'a''b'";
String[] split = new String[3];

Scanner in = new Scanner(s);

split[0] = in.next();
split[1] = in.next();

String temp = in.next();
split[2] = temp.substring(1,temp.length() - 1);

//test output
for(String x : split)
    System.out.println(x);

这将打印:

name
eq
a''b

如果您需要更通用的解决方案,则需要提供更多详细信息。
希望这会有所帮助。

答案 3 :(得分:0)

我将如何做:

String value = "name eq 'a''b'";
value = value.replaceAll(" '", " ").replaceAll("'$", "");
System.out.println(value);
String[] arr = value.split(" ");

答案 4 :(得分:0)

您可以尝试使用Lookaround

模式

(?<!')'(?!')

示例代码:

System.out.println(Arrays.toString("name eq 'a''b'".split("(?<!')'(?!')")));

输出:

[name eq , a''b] 

模式说明:

  (?<!                     look behind to see if there is not:
    '                        '\''
  )                        end of look-behind
  '                        '\''
  (?!                      look ahead to see if there is not:
    '                        '\''
  )                        end of look-ahead

根据空格或单引号进行拆分

 *(?<!')[ '](?!') *

示例代码:

System.out.println(Arrays.toString("name eq 'a''b'".split(" *(?<!')[ '](?!') *"))); 

输出:

[name, eq, a''b]