gpt4 book ai didi

带有重叠定界符的 Java Pattern.split()

转载 作者:搜寻专家 更新时间:2023-11-01 02:59:10 26 4
gpt4 key购买 nike

首先,我知道有人问过类似的问题,例如:

How to split a string, but also keep the delimiters?

但是,我在使用 Pattern.split() 实现字符串拆分时遇到问题,其中模式基于分隔符列表,但它们有时会出现重叠。这是示例:

目标是根据一组被斜杠包围的已知码字拆分字符串,我需要保留定界符(码字)本身和它后面的值(可能是空字符串)。

对于这个例子,代码字是:

/ABC/
/DEF/
/GHI/

基于上面引用的线程,该模式构建如下,使用前瞻和后视将字符串标记为代码字和值:

((?<=/ABC/)|(?=/ABC/))|((?<=/DEF/)|(?=/DEF/))|((?<=/GHI/)|(?=/GHI/))

工作字符串:

"123/ABC//DEF/456/GHI/789"

使用拆分,这很好地标记为:

"123","/ABC/","/DEF/","456","/GHI/","789"

问题字符串(注意“ABC”和“DEF”之间的单斜杠):

"123/ABC/DEF/456/GHI/789"

这里的预期是“DEF/456”是“/ABC/”代码字之后的值,因为“DEF/”位实际上不是代码字,而只是看起来像一个!

期望的结果是:

"123","/ABC/","DEF/456","/GHI/","789"

实际结果是:

"123","/ABC","/","DEF/","456","/GHI/","789"

如您所见,“ABC”和“DEF”之间的斜杠本身作为 token 被隔离。

我已经尝试过仅使用前瞻或后视的其他线程的解决方案,但它们似乎都遇到了同样的问题。任何帮助表示赞赏!

最佳答案

如果您对 find 而不是 split 没问题,使用一些非贪婪匹配,试试这个:

public class SampleJava {
static final String[] CODEWORDS = {
"ABC",
"DEF",
"GHI"};
static public void main(String[] args) {
String input = "/ABC/DEF/456/GHI/789";
String codewords = Arrays.stream(CODEWORDS)
.collect(Collectors.joining("|", "/(", ")/"));
// codewords = "/(ABC|DEF|GHI)/";
Pattern p = Pattern.compile(
/* codewords */ ("(DELIM)"
/* pre-delim */ + "|(.+?(?=DELIM))"
/* final bit */ + "|(.+?$)").replace("DELIM", codewords));
Matcher m = p.matcher(input);
while(m.find()) {
System.out.print(m.group(0));
if(m.group(1) != null) {
System.out.print(" ← code word");
}
System.out.println();
}
}
}

输出:

/ABC/ ← code word

DEF/456

/GHI/ ← code word

789

关于带有重叠定界符的 Java Pattern.split(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41167287/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com