正则表达式根据拆分索引处的长度和相邻字符拆分字符串

时间:2016-11-13 16:26:20

标签: java regex string split

假设这是我的样本字符串:

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实现这一目标。

如果我找到除字母数字或空格以外的拆分索引的邻居字符,我已尝试迭代字符串并递减拆分索引。我觉得我目前的方法是使代码变得复杂,而使用正则表达式会简化代码。

1 个答案:

答案 0 :(得分:2)

查看此代码是否有帮助

DIV

regex101 online test

  

拆分索引处的相邻字符是字母数字或空格

我假设你想要匹配(?<=[\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));
    }
}