gpt4 book ai didi

java - 在java匹配中使用正向先行模式

转载 作者:行者123 更新时间:2023-12-02 11:16:06 26 4
gpt4 key购买 nike

我有一个任务,需要解析一些数据并将其迁移到另一列。并且在某些情况下我需要根据情况更换一些部件。

我读到java Pattern/Matcher支持look-ahead/look-behind操作(或分组,我不知道它到底是如何调用的)。

例如我有这样的字符串100 K,我想将其转换为 100000

我使用了这样的模式:(?i)(?=[0-9]+)\s*[k]\b

Matcher m = Pattern.compile("(?i)(?=[0-9]+)\\s*[k]\\b").matcher("100 K");
if(m.find()){
System.out.println(m.start());
return;
}
System.out.println("false");

结果我总是收到false。我预计会看到 3。如果我将模式更改为 (?i)([0-9]+)\\s*[k]\\b 并使用精确匹配(matches) 操作,那么我看到 true 并且如果我将模式更改为负前瞻 (?i)(?![0-9]+)\\s*[k]\\b 然后 find() 返回 true 并且 start() 返回 3

问题是我在模式上犯了错误还是我以错误的方式使用了它?

最佳答案

您无需提前考虑这一点。按照你写的方式,它正在寻找后跟 0-9 的内容(而不是 0-9 后跟 k),然后需要空格和 k,这不可能与第一部分匹配,必须有那里是数字 - 不是空格,并且立即是 k 。

(?i)1(?=[0-9]+)([0-9]+)\s*[k]\b  

(?i)([0-9]+)(?=\s*[k])\b

会匹配,但它似乎不是您所需要的,因为您想替换“k”。您可以通过捕获组来做到这一点。你的负向前瞻尝试实际上是返回你想要的索引,但是以一种奇怪的方式 - 它正在寻找后面没有数字的东西,并且是空格+ k。它实际上不需要这些数字。

(?i)([0-9]+)(\s*[k])\b   

将捕获第二组中的“k”。然后你可以使用:

m.replaceFirst(m.group(1) + "000")

关于java - 在java匹配中使用正向先行模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50275443/

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