gpt4 book ai didi

java - Java 中的正则表达式 : Not able to to detect newlines using ^ in a multiline mode

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:16:46 26 4
gpt4 key购买 nike

我有一个字符串:

*abc*
**def**
***ghi***

我想删除换行符开头的所有星号。输出应该是:

abc*
def**
ghi***

我使用了正则表达式:^\\*+

但是它删除了字符串中的所有星号!我不明白为什么。

我的代码:

String input="*abc*\n**def**\n***hij***";
Pattern p=Pattern.compile("(^(\\*+))", Pattern.MULTILINE);
Matcher m=p.matcher(input);

while(m.find())
{input=input.replace(m.group(1), "");
}
System.out.println(input);

最佳答案

But it removes all the astericks in the string! I couldn't understand why.

它的发生是因为您在 while 循环中执行的 replace()。如果在字符串中找到您的模式,则 group(1) 将包含没有 ^\\*+ 部分。因此,如果您替换 *,它将替换字符串中的所有 *

第二次,它匹配开头的**。然后你替换 group(1) 也就是 **,最后也会替换 **。记住,String#replace()方法替换所有出现的地方。尝试将字符串的第 2 行更改为 - **def***,您会看到它会在末尾留下一个 *

因为您只需要替换就不必使用 while 循环和 find() 方法。只需使用 Matcher#replaceAll()方法。您的正则表达式完全没问题,您在那里不需要任何捕获组:

Pattern.compile("^\\*+", Pattern.MULTILINE).matcher(input).replaceAll("");

这也可以用简单的 String#replaceAll() 来完成.为此,您可以在正则表达式中使用 (?m) 标志表达式,相当于 Pattern.MULTILINE :

Multiline mode can also be enabled via the embedded flag expression (?m).

所以,就这样做:

input = input.replaceAll("(?m)^\\*+", "");

关于java - Java 中的正则表达式 : Not able to to detect newlines using ^ in a multiline mode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18940872/

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