gpt4 book ai didi

java - 正则表达式似乎对特殊字符无效(例如 +-.,!@#$%^&*;)

转载 作者:行者123 更新时间:2023-11-29 05:01:10 34 4
gpt4 key购买 nike

我正在使用正则表达式打印出一个字符串并在字符限制后添加一个新行。我不想拆分一个单词,如果它达到限制(开始在下一行打印单词),除非一组连接的字符超过限制,然后我只是在下一行继续单词的结尾。但是,当我点击特殊字符(例如 +-.,!@#$%^&*;)时,您会在下面测试我的代码时看到,出于某种原因,它会在限制中添加一个额外的字符。这是为什么?

我的职能是:

public static String limiter(String str, int lim) {
str = str.trim().replaceAll(" +", " ");
str = str.replaceAll("\n +", "\n");
Matcher mtr = Pattern.compile("(.{1," + lim + "}(\\W|$))|(.{0," + lim + "})").matcher(str);
String newStr = "";
int ctr = 0;
while (mtr.find()) {
if (ctr == 0) {
newStr += (mtr.group());
ctr++;
} else {
newStr += ("\n") + (mtr.group());
}
}
return newStr ;
}

所以我的输入是: ojit_代码

字符行限制为 7。

输出:

456789 +
-.,!@#$%
^&*();\/
|<>"

正确的输出应该是:

456789
+-.,!@#
$%^&*()
;\/|<>"

我的代码链接到一个在线编译器,您可以在这里运行: https://ideone.com/9gckP1

最佳答案

您需要将 (\W|$) 替换为 \b 因为您的目的是匹配整个单词(和 \b提供此功能)。此外,由于您不需要在新创建的行中使用尾随空格,因此您还需要使用 \s*

所以,使用

Matcher mtr = Pattern.compile("(?U)(.{1," + lim + "}\\b\\s*)|(.{0," + lim + "})").matcher(str);

参见 demo

请注意,此处使用 (?U) 来“修复”单词边界行为,使其与 \w 保持同步(这样变音符号就不会被视为单词字符)。

关于java - 正则表达式似乎对特殊字符无效(例如 +-.,!@#$%^&*;),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32046668/

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