假设这是我的样本字符串:
String s = "Just a sa'mple 'String.";
我想拆分此字符串,使得令牌长度始终小于或等于5个字符,并且拆分索引处的相邻字符也可以是字母数字或空格。
String tokens[] = s.split(<regex>);
所以这里的tokens数组应该包含以下字符串标记:
"Just ","a s","a'mpl","e 'St","ring."
请注意第二个令牌&#34; s&#34;预计只有三个字符。我无法分割第二个令牌,例如&#34; sa&#39;&#34;或者&#34; sa&#34;作为非字母数字字符不正确&#34;&#39;&#34;&#34;&#34; (单引号)将在第一种情况下的拆分索引之前,并且在第二种情况下将在拆分索引之后。
我正在尝试使用Java实现这一目标。
如果我找到除字母数字或空格以外的拆分索引的邻居字符,我已尝试迭代字符串并递减拆分索引。我觉得我目前的方法是使代码变得复杂,而使用正则表达式会简化代码。
答案 0 :(得分:2)
查看此代码是否有帮助
DIV
拆分索引处的相邻字符是字母数字或空格
我假设你想要匹配(?<=[\w\d\s.]|^)[\w\d\s.].{0,3}[\w\d\s.](?=[\w\d\s.]|$)
,而不是只在边缘使用字母数字字符,因为你的上一组有它。
在java中它就像这个(由regex101提供的代码)
.
结果:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
final String regex = "(?<=[\\w\\d\\s.]|^)[\\w\\d\\s.].{0,3}[\\w\\d\\s.](?=[\\w\\d\\s.]|$)";
final String string = "Just a sa'mple 'String.";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}