我的目标是:
给定字符串:"Part1-part2-part3-part4-part5"
在第二次出现"-"时拆分它,
所以我期望一个数组[ "Part1-part2", "part3-part4-part5" ]
我做了什么:
"Part1-part2-part3-part4-part5".split("(?<=^\w+-\w+)-"
但是jdk 8上的结果:
它找不到第二个'-'的匹配项,并返回整个字符串
证据:https://ideone.com/myWppm
但是,当我尝试在线regex处理网站和node.js(或chrome([相信我,modern js支持lookbacking]时,结果如预期
证据:https://ideone.com/ttQWNr
我现在正在使用的破解(不符合解决方案的条件(:
使用前向而非后向,从末尾开始第三次出现"-">"Part1-part2-part3-part4-part5".split("-(?=\w+-\w+-\w+$)");
Java确实支持使用量词的有限查找,例如{0,100}
要匹配除连字符之外的任何字符,可以使用[^-]
,它是一个否定字符类。
如果您想排除匹配的换行符,可以将其扩展到[^-\r\n]
您可以使用:
(?<=^[^-]{0,100}-[^-]{0,100})-
部件内
(?<=
正面向后看,断言左边的是^
字符串开始[^-]{0,100}
-匹配0-100倍除-
以外的任何字符,然后匹配第一个-
[^-]{0,100} Match 0 - 100 times any char except
-`
)
密切关注-
匹配第二个要拆分的-
Regex演示| Java演示
例如
System.out.println(
Arrays.toString(
"Part1-part2-part3-part4-part5".split("(?<=^[^-]{0,100}-[^-]{0,100})-")
)
);
输出
[Part1-part2, part3-part4-part5]
不使用split()
,而是使用匹配:
String input = "Part1-part2-part3-part4-part5";
String regex = "(\w+-\w+)-(.*)"
String[] result; // just to simulate result of split()
Matcher m = Pattern.compile(regex).matcher(input);
if (m.matches()) {
result = new String[] { m.group(1), m.group(2) };
} else {
result = new String[] { input };
}
当然,这是更多的代码,但您可以轻松地增强正则表达式以执行更多的验证,例如,除了-
(显然还有_
(之外,没有其他特殊字符,即使是第二个短划线之后的文本。
String input = "Part1-part2-part3-part4-part5";
String[] parts = input.split("-(?=[^-]+-[^-]+-[^-]+$)");
System.out.println(Arrays.toString(parts));
此打印:
[Part1-part2, part3-part4-part5]