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

时间:2018-03-22 02:49:20

标签: java regex string

我有一个源字符串,我想将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];
}

这给了我想要的data, data, data, data。我想看看是否可以使用正确的正则表达式进行一次拆分:

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

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

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

预期结果:“Ann,Bob,Clara,David”

3 个答案:

答案 0 :(得分:3)

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

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

正则表达式查找单词字符(字母,数字和下划线)并捕获它。然后它再次查找管道符号(转义为正则表达式中没有特殊含义),再次使用单词字符。此管道加字词可以发生任意数量(零到多次)。之后可以是逗号,可选。

打印

  

     

鲍勃

     

克拉拉

     

大卫

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

Pattern.compile("(\\w+)(?:\\|\\w+)*,?");

答案 1 :(得分:2)

在字符串中,

  

安| xcjiajeaw,鲍勃| aijife | vdsjisdjfe,克拉拉,大卫| rijfidjf

\\|.*?, - 这将匹配|anynoncommastring, 但这与最终的|rijfidjf不匹配,因为它不以逗号结尾。为了与之匹配,请使用(,|$)而不是,,制作正则表达式\\|.*?(,|$)

但上述内容与单个孤立的逗号不匹配,因此,\\|.*?(,|$)交替显示最终正则表达式(\\|.*?(,|$)|,)

模式(\\|.*?(,|$)|,)有效,

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

答案 2 :(得分:1)

我提出了以下解决方案:

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]