java正则表达式-拆分但忽略引号内的文本?

java正则表达式-拆分但忽略引号内的文本?,java,regex,Java,Regex,仅使用正则表达式方法,方法String.replaceAll和ArrayList 如何将字符串拆分为标记,但忽略引号中存在的分隔符? 分隔符是非字母数字或带引号文本的任何字符 例如: 字符串: 你好^world'this*有两个代币' 应输出: 你好 worldthis*有两个代币 你不能以任何合理的方式。您正在提出一个正则表达式不擅长的问题。您无法以任何合理的方式解决。您提出了一个正则表达式不擅长的问题。不要为此使用正则表达式。这行不通。改为使用/编写解析器 您应该为正确的任务使用正确的工具。

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

例如: 字符串:

你好^world'this*有两个代币'

应输出:

你好 worldthis*有两个代币
你不能以任何合理的方式。您正在提出一个正则表达式不擅长的问题。

您无法以任何合理的方式解决。您提出了一个正则表达式不擅长的问题。

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


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

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

对于正确的任务,您应该使用正确的工具。

使用a来标识您要保留的零件,而不是要拆分的零件:

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));
}
联机查看:使用a标识要保留的零件,而不是要拆分的零件:

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));
}

在线查看:

我知道已经有一个非常好且被接受的答案,但我想添加另一个基于正则表达式的方法,可以说更简单的方法,使用任何非字母数字分隔符拆分给定文本,而不是使用

正则表达式:

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

代码:

输出:

演示:


我知道已经有了一个非常好且被接受的答案,但我想添加另一个基于正则表达式的方法,可以说更简单的方法,使用任何非字母数字分隔符拆分给定文本,而不是使用

正则表达式:

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

代码:

输出:

演示:


你知道你的分隔符是什么样子的,所以你不需要正则表达式,你需要在分隔符上拆分字符串。为正确的工作使用正确的工具。我不知道,当您的问题格式不正确时,分隔符可以是任何非字母的字符。确定您的分隔符是什么,然后相应地拆分字符串。@babybang:如果输入包含不匹配的引号,该怎么办?为什么预期输出中缺少引号?@JackManey:这个问题不是格式错误。是的,有点不明确,但它比这里的大多数问题都要明确。你知道你的分隔符是什么样子的,所以你不需要正则表达式,你需要在分隔符上拆分字符串。为正确的工作使用正确的工具。我不知道,当您的问题格式不正确时,分隔符可以是任何非字母的字符。确定您的分隔符是什么,然后相应地拆分字符串。@babybang:如果输入包含不匹配的引号,该怎么办?为什么预期输出中缺少引号?@JackManey:这个问题不是格式错误。是的,有点不明确,但它比这里的大多数问题都明确。我非常相信正则表达式的定义。请看Jack Maney的评论。如果您认为正则表达式不适合这样做,您至少可以展示一种替代/更好的方法吗?除非你能提出更好的建议,否则这个答案对OP或其他任何人都没有帮助。我很高兴对你的答案投赞成票,但除了回答字面上的问题外,我不会回答类似的问题。我非常相信正则表达式的定义。请看Jack Maney的评论。如果您认为正则表达式不适合这样做,您至少可以展示一种替代/更好的方法吗?除非你能提出更好的建议,否则这个答案对OP或其他任何人都没有帮助。我很高兴对你的答案投赞成票,但除了回答字面上的问题外,我不会回答这样的问题。
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]