我正在使用正则表达式打印字符串并在字符限制后添加新行。如果它达到限制(在下一行开始打印单词),我不想分开一个单词,除非一组连接的字符超过限制,然后我只是继续下一行的单词结尾。但是,当我点击特殊字符(例如+ - 。,!@#$%^& *;)时,我会在下面测试我的代码时看到它,它会因某种原因在限制中添加一个额外的字符。这是为什么?
我的功能是:
#imagecontainer {
background-image: url('Images/example.jpg') no-repeat;
background-size: cover;
background-size: contain;
width: 10%;
height: 10%;
border: 1px solid;
}
所以我的意见是:
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 ;
}
字符行限制为7。
输出:
String str = " The 123456789 456789 +-.,!@#$%^&*();\\/|<>\"\' fox jumpeded over the uf\n 2 3456 green fence ";
正确的输出应该是:
456789 +
-.,!@#$%
^&*();\/
|<>"
我的代码链接到您可以在此处运行的在线编译器: https://ideone.com/9gckP1
答案 0 :(得分:2)
您需要将(\W|$)
替换为\b
,因为您的意图是匹配整个单词(\b
提供此功能)。此外,由于您不需要在新创建的行上使用尾随空格,因此您还需要使用\s*
。
所以,使用
Matcher mtr = Pattern.compile("(?U)(.{1," + lim + "}\\b\\s*)|(.{0," + lim + "})").matcher(str);
请参阅demo
请注意,此处(?U)
用于&#34;修复&#34;单词边界行为使其与\w
保持同步(因此变音符号不被视为单词字符)。
答案 1 :(得分:1)
在您的模式中,\\W
是第一个捕获组的一部分。它将这一个(非单词)字符添加到.{1,limit}
模式。
尝试:&#34;(。{1,&#34; + lim +&#34;})(\ W | $)|(。{0,&#34; + lim +&#34 ;})&#34;
(我目前无法使用您的正则表达式在线编译器)