有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

忽略模式的java字符串拆分正则表达式

我有一个源字符串,我想将data拆分出来:

String source = "data|junk,data|junk|junk,data,data|junk";
String[] result = source.split(",");

上面给出了data|junk, data|junk|junk, data, data|junk。为了进一步获得数据,我做了以下工作:

for (int i = 0; i < result.length; i++) {
    result[i] = result[i].split("\\|")[0];
}

这就是我想要的。我想看看是否可以使用正确的正则表达式在一次拆分中完成:

String[] result = source.split("\\|.*?,");

上面给出了data, data, data,data|junk,其中最后两个数据没有被分割。你能帮我用正确的正则表达式得到我想要的结果吗

示例字符串:“Ann | xcjiajeaw,Bob | aijife | vdsjisdjfe,Clara,David | rijfidjf”

预期结果:“安,鲍勃,克拉拉,大卫”


共 (3) 个答案

  1. # 1 楼答案

    您可以将正则表达式更改为“垃圾”,然后在匹配数据时保持匹配:

    import java.util.regex.Pattern;
    import java.util.regex.Matcher;
    
    public class RegexTest {
        public static void main(String[] args) {
            String input = "Ann|xcjiajeaw,Bob|aijife|vdsjisdjfe,Clara,David|rijfidjf";
            Pattern p = Pattern.compile("(\\w+)(\\|\\w+)*,?");
            Matcher m = p.matcher(input);
            while (m.find()) {
                System.out.println(m.group(1));
            }
        }
    }
    

    正则表达式查找单词字符(字母、数字和下划线)并捕获这些字符。然后,它会再次查找具有单词字符的管道符号(转义,以便在正则表达式中没有特殊含义)。此管道加单词字符可以出现任意次数(零到多次)。之后可以是逗号(可选)

    这张照片

    Ann

    Bob

    Clara

    David

    它还捕获“垃圾”,您可以通过循环中的m.group(2)访问它。如果您不想捕获它,请在正则表达式中插入?:

    Pattern.compile("(\\w+)(?:\\|\\w+)*,?");
    
  2. # 2 楼答案

    我提出了以下解决方案:

    String source = "one|junk,two|junk|junk,three,four|junk|junk";
    String[] result = source.split("([|](?:(.*?,(?=[^,]+[|,]|$))|.*$))|,");
    System.out.println(Arrays.toString(result));
    
    [one, two, three, four]
    
  3. # 3 楼答案

    在字符串中

    Ann|xcjiajeaw,Bob|aijife|vdsjisdjfe,Clara,David|rijfidjf

    \\|.*?,-这将匹配|anynoncommastring, 但这与最后的|rijfidjf不匹配,因为它不以逗号结尾。因此,为了匹配这一点,使用(,|$)而不是仅仅使用,,使regex \\|.*?(,|$)

    但是上面的语句不匹配一个单独的逗号,因此将,\\|.*?(,|$)交替使用,生成最后的正则表达式(\\|.*?(,|$)|,)

    模式(\\|.*?(,|$)|,)起作用

    String source = "Ann|xcjiajeaw,Bob|aijife|vdsjisdjfe,Clara,David|rijfidjf";
    String[] result = source.split("(\\|.*?(,|$)|,)");
    for (int i = 0; i < result.length; i++) {
        System.out.println(result[i]);
    }
    

    输出:

    Ann
    Bob
    Clara
    David