对于特殊字符,正则表达式似乎已关闭(例如+ - 。,!@#$%^& *;)

时间:2015-08-17 09:15:20

标签: java regex debugging limit

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

我的功能是:

#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

2 个答案:

答案 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;

(我目前无法使用您的正则表达式在线编译器)