java - 将正则表达式中的字符串与 - 作为一个单词
问题描述
我试图在每组正则表达式中用 32 个字符分割一个句子。如果第 32 个字符是单词中的字母,则句子在完整单词后拆分。当我的输入是一个带有“-”的句子时,它也会拆分该单词。
这是我正在使用的正则表达式
(\b.{1,32}\b\W?)
输入字符串:
半带骨螺旋火腿带深色包装史密斯菲尔德半带骨螺旋火腿带釉包装
结果组:
- 半骨螺旋 int with
- 黑暗的 Packd Smithfield 半骨-
- 带釉包的螺旋火腿
在上面的拆分中,“Bone-in”是一个词,但正则表达式会考虑单独的词来拆分它。如何修改我的正则表达式以将“-”视为一个词?简而言之,我希望在 Bone-in 之后进行拆分。
谢谢你。
解决方案
您可以使用
(\b.{1,32}(?![\w-])\W?)
细节
\b
- 单词边界.{1,32}
- 1 到 32 个字符(换行符除外),尽可能多(?![\w-])
- 当前位置左侧的字符不能是单词(字母、数字或_
)或-
字符\W?
- 一个可选的非单词字符。
在 Java 中,使用以下方法:
public static String[] splitIncludeDelimeter(String regex, String text){
List<String> list = new LinkedList<>();
Matcher matcher = Pattern.compile(regex).matcher(text);
int now, old = 0;
while(matcher.find()){
now = matcher.end();
list.add(text.substring(old, now));
old = now;
}
if(list.size() == 0)
return new String[]{text};
//adding rest of a text as last element
String finalElement = text.substring(old);
list.add(finalElement);
return list.toArray(new String[list.size()]);
}
String s = "Half Bone-in Spiral int with dark Packd Smithfield Half Bone-in Spiral Ham with Glaze Pack";
String[] res = splitIncludeDelimeter("(\\b.{1,32}(?![\\w-])\\W?)", s);
System.out.println(Arrays.toString(res));
// => [Half Bone-in Spiral int with , dark Packd Smithfield Half , Bone-in Spiral Ham with Glaze , Pack, ]