Java 使用正则表达式拆分引号和逗号内的数据

Java 使用正则表达式拆分引号和逗号内的数据,java,regex,string,Java,Regex,String,我正在努力为以下数据准备正则表达式 我有这样的输入 "%,.2f","mm/DD/YYYY","1" %,.2f mm/DD/YYYY 1 我想得到这样的结果 "%,.2f","mm/DD/YYYY","1" %,.2f mm/DD/YYYY 1 我尝试使用多个正则表达式,但没有任何效果 有没有办法在Java中实现这一点 我正在一个内部框架中编写一个解析器,它解析方法和参数,比如formatCurrency(“%,.2f”,“mm/DD/YYYY”,“1”)。我编写了一个正则表达式来分别

我正在努力为以下数据准备正则表达式

我有这样的输入

"%,.2f","mm/DD/YYYY","1"
%,.2f
mm/DD/YYYY
1
我想得到这样的结果

"%,.2f","mm/DD/YYYY","1"
%,.2f
mm/DD/YYYY
1
我尝试使用多个正则表达式,但没有任何效果

有没有办法在Java中实现这一点

我正在一个内部框架中编写一个解析器,它解析方法和参数,比如
formatCurrency(“%,.2f”,“mm/DD/YYYY”,“1”)
。我编写了一个正则表达式来分别获取函数名和参数

使用逗号拆分器有一些限制,因为函数参数也可以包含逗号。我认为即使使用引号拆分也会有同样的问题。我认为唯一的方法是使用正则表达式进行解析,但是理解正则表达式很困难


Regex解析这一点会更有帮助

您可以使用
匹配器
find()
每列:

String s = "\"%,.2f\",\"mm/DD/YYYY\",\"1\"";
Matcher m = Pattern.compile("(?<=(?:^|,)\")([^\"]*)(?=\")").matcher(s);
List<String> cols = new ArrayList<>();
while (m.find()) {
    cols.add(m.group(1)); // group(0) works, too
}

System.out.println(cols);
// [%,.2f, mm/DD/YYYY, 1]
String s=“\”%,.2f\”,“mm/DD/YYYY\”,“1\”;

Matcher m=Pattern.compile((?您想将字符串分割为两个引号
,逗号
作为分隔符

此正则表达式捕获所需字符串,以防您保留以下格式:

"(.*?)"

Java代码中也有同样的代码,这可能对您更有利。不要忘记将引号转义为“
”。否则,它将被理解为字符串的结束/开始:

List<String> results = new ArrayList<>();
Matcher m = Pattern.compile("\"(.*?)\"") .matcher(input);
while (m.find()) {
    results.add(m.group(1));
}
List results=new ArrayList();
Matcher m=Pattern.compile(“\”(.*?\”).Matcher(输入);
while(m.find()){
结果:添加(m组(1));
}

我认为自己尝试解析CSV文件不是一个好主意。这种格式有很多特殊情况,仅对于严肃的产品,我建议您使用现有的库

我建议您使用:

只需在POM文件中添加依赖项:

<dependencies>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-csv</artifactId>
        <version>1.1</version>
    </dependency>
</dependencies>
而且,我只有在我的武器库里没有其他东西的时候才会去雷格克斯


代码看起来不对劲,它们可能隐藏了很多角落的bug,它们是调试和修复的噩梦(几周后,你会忘记你是如何制作正则表达式的,你会花很多时间试图重新理解它).

您可以使用以下三种场景:字符串开头、字符串中间、字符串结尾

(^"|","|"$)

Result : [, %,.2f, mm/DD/YYYY", 1]
  • ^“
    将与字符串开头的匹配
  • ,“
    将与中间的匹配
  • “$
    将与末尾的匹配

Result : [, %,.2f, mm/DD/YYYY", 1]

你想用正则表达式解析CSV吗?有一些库可以处理特殊情况,并为你完成所有这些。如果输入规则如此严格(而且你经常使用它),你可以用substring代替headi来完成。我通常会发现substring代码很脆弱,regex代码不可读。用更多详细信息编辑我的问题
m.group()
->
m.group(1)
我有一个非常简单的用例来解析两个或三个逗号分隔的参数。在这个用例中使用csv解析器看起来更重…也许你可以解释一下你的(复杂的)更多的模式以及为什么它比Nikolas Charalambidis的答案中更简单的模式更可取。你对“向后看”和“向前看”的限制确保了更合适的匹配,但是没有一个正则表达式初学者能够理解你所写的内容。你能解释一下这个正则表达式吗?更新了。让我知道它是否有意义。