我有下一个文字
aaa|bbbb|cccc|dddd\|eeee|ffff
我想分开|并且在|时排除之前是\并获得
AAA
BBBB
CCCC
DDDD \ | EEEE
FFFF
感谢。
ps:我尝试使用一些正则表达式生成器(例如http://txt2re.com/)但坦率地说regexp是友好的。
更新:最后我放弃了。 Regexp并不快(我做了一个基准),既不清楚(与每个人都可以遵循的功能相比),然后我跳过它,现在我使用的是真正的代码。
答案 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