Java 正则表达式只匹配逗号而不匹配括号?

Java 正则表达式只匹配逗号而不匹配括号?,java,regex,Java,Regex,我有一个字符串,看起来如下所示: 12,44,foo,bar,(23,45,200),6 我想创建一个与逗号匹配的正则表达式,但只匹配不在括号内的逗号(在上面的示例中,除了23和45后面的两个逗号外,所有逗号都匹配)。我该怎么做(Java正则表达式,如果有区别的话)?假设不存在嵌套参数(否则,由于不支持递归匹配,您不能将Java正则表达式用于此任务): 此正则表达式使用确保后面的下一个括号(如果有)不是右括号。只允许逗号匹配。假设不存在嵌套的参数(否则,由于不支持递归匹配,因此不能将Java正

我有一个字符串,看起来如下所示:

12,44,foo,bar,(23,45,200),6

我想创建一个与逗号匹配的正则表达式,但只匹配不在括号内的逗号(在上面的示例中,除了23和45后面的两个逗号外,所有逗号都匹配)。我该怎么做(Java正则表达式,如果有区别的话)?

假设不存在嵌套参数(否则,由于不支持递归匹配,您不能将Java正则表达式用于此任务):


此正则表达式使用确保后面的下一个括号(如果有)不是右括号。只允许逗号匹配。

假设不存在嵌套的参数(否则,由于不支持递归匹配,因此不能将Java正则表达式用于此任务):


此正则表达式使用确保后面的下一个括号(如果有)不是右括号。只有逗号才允许匹配。

我不理解对正则表达式的痴迷,因为它们不适合用于大多数任务

String beforeParen = longString.substring(longString.indexOf('(')) + longString.substring(longString.indexOf(')') + 1);
int firstComma = beforeParen.indexOf(',');
while (firstComma != -1) {
    /* do something. */
    firstComma = beforeParen.indexOf(',', firstComma + 1);
}

(当然,这假设总是有一个左括号和一个匹配的右括号紧跟其后。)

我不理解对正则表达式的痴迷,因为它们不适合用于大多数任务

String beforeParen = longString.substring(longString.indexOf('(')) + longString.substring(longString.indexOf(')') + 1);
int firstComma = beforeParen.indexOf(',');
while (firstComma != -1) {
    /* do something. */
    firstComma = beforeParen.indexOf(',', firstComma + 1);
}

(当然,这假设总是有一个左括号和一个匹配的右括号紧跟其后。)

保罗,重新提出这个问题,因为它有一个简单的解决方案,没有提到。(在为某个客户进行研究时发现了您的问题。)

另外,现有的解决方案检查逗号后面是否没有括号,但这并不保证它嵌入到括号中

正则表达式非常简单:

\(.*?\)|(,)
交替的左侧匹配完整的括号集。我们将忽略这些匹配。右侧匹配并捕获逗号到组1,我们知道它们是右逗号,因为它们没有与左侧的表达式匹配

在这里,您可以在右下窗格中看到组1捕获

您说过要匹配逗号,但您可以使用相同的总体思路来拆分或替换

要匹配逗号,您需要检查组1。这个完整的计划的唯一目标就是做到这一点

import java.util.*;
import java.io.*;
import java.util.regex.*;
import java.util.List;

class Program {
public static void main (String[] args) throws java.lang.Exception  {

String subject = "12,44,foo,bar,(23,45,200),6";
Pattern regex = Pattern.compile("\\(.*?\\)|(,)");
Matcher regexMatcher = regex.matcher(subject);
List<String> group1Caps = new ArrayList<String>();

// put Group 1 captures in a list
while (regexMatcher.find()) {
if(regexMatcher.group(1) != null) {
group1Caps.add(regexMatcher.group(1));
}
} // end of building the list

// What are all the matches?
System.out.println("\n" + "*** Matches ***");
if(group1Caps.size()>0) {
for (String match : group1Caps) System.out.println(match);
}
} // end main
} // end Program
import java.util.*;
导入java.io.*;
导入java.util.regex.*;
导入java.util.List;
班级计划{
公共静态void main(字符串[]args)引发java.lang.Exception{
字符串subject=“12,44,foo,bar,(23,45200),6”;
Pattern regex=Pattern.compile(“\\(.*?\\)|(,)”;
Matcher regexMatcher=regex.Matcher(主题);
List group1Caps=new ArrayList();
//将组1捕获放入列表中
while(regexMatcher.find()){
if(regexMatcher.group(1)!=null){
group1Caps.add(regexMatcher.group(1));
}
}//创建列表的结束
//所有的比赛都是什么?
System.out.println(“\n”+“***匹配***”);
if(group1Caps.size()>0){
for(字符串匹配:group1Caps)System.out.println(匹配);
}
}//末端总管
}//结束程序
这是一个

要使用相同的技术进行拆分或替换,请参阅参考资料中文章中的代码示例

参考


  • 保罗,重新提出这个问题,因为它有一个简单的解决方案,没有提到。(在为某个客户进行研究时发现了您的问题。)

    另外,现有的解决方案检查逗号后面是否没有括号,但这并不保证它嵌入到括号中

    正则表达式非常简单:

    \(.*?\)|(,)
    
    交替的左侧匹配完整的括号集。我们将忽略这些匹配。右侧匹配并捕获逗号到组1,我们知道它们是右逗号,因为它们没有与左侧的表达式匹配

    在这里,您可以在右下窗格中看到组1捕获

    您说过要匹配逗号,但您可以使用相同的总体思路来拆分或替换

    要匹配逗号,您需要检查组1。这个完整的计划的唯一目标就是做到这一点

    import java.util.*;
    import java.io.*;
    import java.util.regex.*;
    import java.util.List;
    
    class Program {
    public static void main (String[] args) throws java.lang.Exception  {
    
    String subject = "12,44,foo,bar,(23,45,200),6";
    Pattern regex = Pattern.compile("\\(.*?\\)|(,)");
    Matcher regexMatcher = regex.matcher(subject);
    List<String> group1Caps = new ArrayList<String>();
    
    // put Group 1 captures in a list
    while (regexMatcher.find()) {
    if(regexMatcher.group(1) != null) {
    group1Caps.add(regexMatcher.group(1));
    }
    } // end of building the list
    
    // What are all the matches?
    System.out.println("\n" + "*** Matches ***");
    if(group1Caps.size()>0) {
    for (String match : group1Caps) System.out.println(match);
    }
    } // end main
    } // end Program
    
    import java.util.*;
    导入java.io.*;
    导入java.util.regex.*;
    导入java.util.List;
    班级计划{
    公共静态void main(字符串[]args)引发java.lang.Exception{
    字符串subject=“12,44,foo,bar,(23,45200),6”;
    Pattern regex=Pattern.compile(“\\(.*?\\)|(,)”;
    Matcher regexMatcher=regex.Matcher(主题);
    List group1Caps=new ArrayList();
    //将组1捕获放入列表中
    while(regexMatcher.find()){
    if(regexMatcher.group(1)!=null){
    group1Caps.add(regexMatcher.group(1));
    }
    }//创建列表的结束
    //所有的比赛都是什么?
    System.out.println(“\n”+“***匹配***”);
    if(group1Caps.size()>0){
    for(字符串匹配:group1Caps)System.out.println(匹配);
    }
    }//末端总管
    }//结束程序
    
    这是一个

    要使用相同的技术进行拆分或替换,请参阅参考资料中文章中的代码示例

    参考


  • 可以有嵌套的括号吗?是否可以有多对?字符串是否可以有不匹配的括号,如
    “12,44,12)foo,bar,(23,45200),6”
    ?是否可以有嵌套的括号?可以有多对吗?字符串可以有不匹配的括号,如
    “12,44,12)foo,bar,(23,45200),6”
    ?并且它假定括号后没有逗号。你测试过这个吗?它甚至在Paul提供的示例字符串上失败。编写一个正确的解析器,它也不会因格式错误的输入而阻塞,这可能与编写一个正确的正则表达式一样困难(如果不是更难的话)。在这个用例中,如果输入符合定义的标准,我更喜欢正则表达式。你说得对,我忽略了结束语后的部分。固定的。:)您如何处理输入,例如
    1,2,(3,4),5,6,(7,8)
    ?抱歉,但是