正则表达式,如何分割|并且在\之前避免分裂

时间:2011-10-07 00:41:27

标签: java regex

我有下一个文字

 aaa|bbbb|cccc|dddd\|eeee|ffff

我想分开|并且在|时排除之前是\并获得

AAA

BBBB

CCCC

DDDD \ | EEEE

FFFF

感谢。

ps:我尝试使用一些正则表达式生成器(例如http://txt2re.com/)但坦率地说regexp是友好的。

更新:最后我放弃了。 Regexp并不快(我做了一个基准),既不清楚(与每个人都可以遵循的功能相比),然后我跳过它,现在我使用的是真正的代码。

3 个答案:

答案 0 :(得分:2)

这应该这样做:

(?<!\\\\)\\|

如果要允许反斜杠转义的反斜杠,可以使用:

(?<!(?<!\\\\)\\\\)\\|

所以给定字符串aaa|bbbb|cccc|dddd\|eeee\\|ffff,分割将是:


    aaa
    bbbb
    cccc
    dddd|eeee\*
    ffff

*或dddd\|eeee\\如果由于某种原因你没有剥离转义反斜杠。

编辑:不熟悉Java正则表达式的味道,为每个棘轮怪物的评论添加了逃脱。

答案 1 :(得分:2)

试图将此添加为对eyelidlessness的答案的评论,但不知道如何在那里格式化...

无论如何,眼睑的回答对我来说是正确的:

    String str = "aaa|bbbb|cccc|dddd\\|eeee|ffff";
    String[] tokens = str.split("(?<!\\\\)\\|");
    System.out.println(Arrays.toString(tokens));    

打印:

[aaa, bbbb, cccc, dddd\|eeee, ffff]

答案 2 :(得分:1)

请勿使用split()。 (如果Java在lookbehind断言中支持无限重复,你可以。但它没有。)

更好地收集| s:

之间的所有匹配项
List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("(?:\\\\.|[^\\\\|])*");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    matchList.add(regexMatcher.group());
}

这正确地将aaa|bbbb\\|cccc|dddd\|eeee|ffff\\\|ggg\\\\|hhhh拆分为

aaa
bbbb\\
cccc
dddd\|eeee
ffff\\\|ggg\\\\
hhhh
相关问题