Java正则表达式lookback与js正则表达式lookback不同

Java正则表达式lookback与js正则表达式lookback不同,java,regex,regex-lookarounds,lookbehind,Java,Regex,Regex Lookarounds,Lookbehind,我的目标是: 给定字符串:“Part1-part2-part3-part4-part5” 在第二次出现“-”时将其拆分, 所以我期望一个数组[“Part1-part2”,“part3-part4-part5”] 我所做的: "Part1-part2-part3-part4-part5".split("(?<=^\\w+-\\w+)-" “Part1-part2-part3-part4-part5”。拆分((?而不是使用split(),使用匹配: String input = "Part1

我的目标是:

给定字符串:
“Part1-part2-part3-part4-part5”

在第二次出现“-”时将其拆分,
所以我期望一个数组
[“Part1-part2”,“part3-part4-part5”]

我所做的:

"Part1-part2-part3-part4-part5".split("(?<=^\\w+-\\w+)-"

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

当然,代码要多一点,但您可以轻松地增强正则表达式以执行更多验证,例如,除了
-
(和
之外,没有特殊字符),即使是第二个破折号之后的文本。

Java不支持可变宽度lookbehinds。假设您的输入字符串总是有五个连字符分隔的术语,我们可以通过在splt之前检查前面是否有两个连字符来表示拆分逻辑:

String input = "Part1-part2-part3-part4-part5";
String[] parts = input.split("-(?=[^-]+-[^-]+-[^-]+$)");
System.out.println(Arrays.toString(parts));
这张照片是:

[Part1-part2, part3-part4-part5]

Java确实支持使用量词进行有限查找,例如
{0100}

要匹配除连字符以外的任何字符,可以使用
[^-]
,这是一个字符

如果要排除匹配的换行符,可以将其扩展到
[^-\\r\\n]

您可以使用:

(?<=^[^-]{0,100}-[^-]{0,100})-
输出

[Part1-part2, part3-part4-part5]

嘿,我必须将这个正则表达式传递给一些使用spark sql的拆分函数的底层代码。我没有选择传递一些lambda/自定义函数对象,因为它就像apache spark的黑盒子一样,它将无法优化操作。所以作为解决方案,我只需要一个正则表达式。要了解一些信息,请检查这里:嘿,我必须传递这个正则表达式是使用spark sql的拆分函数生成的一些代码的基础。我没有选择传递一些lambda/自定义函数对象,因为它就像apache spark的黑盒子,并且它无法优化操作。因此,作为解决方案,我只需要一个正则表达式。要了解一些信息,请检查这里:我给了您一个正则表达式。我不明白你的评论。
[Part1-part2, part3-part4-part5]