在正则表达式中拆分字符串 - 作为一个词

Splitting String in regex with - as one word

我正在尝试在每组正则表达式中拆分一个包含 32 个字符的句子。如果第 32 个字符是单词中的字母,则句子在完整单词后拆分。当我的输入是一个带有“-”的句子时,它也会拆分那个词。

这是我正在使用的正则表达式

(\b.{1,32}\b\W?)

输入字符串:

Half Bone-in Spiral int with dark Packd Smithfield Half Bone-in Spiral Ham with Glaze Pack

结果组:

  1. Half Bone-in Spiral int with
  2. dark Packd Smithfield Half Bone-
  3. in Spiral Ham with Glaze Pack

在上面的拆分中,"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()]);
}

Java example:

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, ]