1

仅使用正则表达式方法、方法 String.replaceAll 和 ArrayList 我如何将字符串拆分为标记,但忽略引号内存在的分隔符?分隔符是任何不是字母数字或引用文本的字符

例如:字符串:

你好^world'这个*有两个标记'

应该输出:

  • 你好
  • worldthis* 有两个标记
4

4 回答 4

5

我知道已经存在一个该死的好且公认的答案,但我想添加另一种基于正则表达式(我可以说更简单)的方法来使用不在单引号内的任何非字母数字分隔符拆分给定文本

正则表达式:

/(?=(([^']+'){2})*[^']*$)[^a-zA-Z\\d]+/

这基本上意味着如果非字母数字文本后跟偶数个单引号,则匹配非字母数字文本,换句话说,如果它在单引号之外,则匹配非字母数字文本。

代码:

String string = "hello^world'this*has two tokens'#2ndToken";
System.out.println(Arrays.toString(
     string.split("(?=(([^']+'){2})*[^']*$)[^a-zA-Z\\d]+"))
);

输出:

[hello, world'this*has two tokens', 2ndToken]

演示:

Here is a live working Demo of the above code.

于 2012-06-02T18:43:54.690 回答
3

You cannot in any reasonable way. You are posing a problem that regular expressions aren't good at.

于 2012-06-02T17:42:23.337 回答
3

使用 aMatcher来标识要保留的部分,而不是要拆分的部分:

String s = "hello^world'this*has two tokens'";
Pattern pattern = Pattern.compile("([a-zA-Z0-9]+|'[^']*')+");
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
    System.out.println(matcher.group(0));
}

在线查看它:ideone

于 2012-06-02T17:46:28.900 回答
1

不要为此使用正则表达式。它行不通。改为使用/编写解析器。

您应该为正确的任务使用正确的工具。

于 2012-06-02T17:45:53.960 回答