首页 > 解决方案 > 将正则表达式中的字符串与 - 作为一个单词

问题描述

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

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

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

输入字符串:

半带骨螺旋火腿带深色包装史密斯菲尔德半带骨螺旋火腿带釉包装

结果组:

  1. 半骨螺旋 int with
  2. 黑暗的 Packd Smithfield 半骨-
  3. 带釉包的螺旋火腿

在上面的拆分中,“Bone-in”是一个词,但正则表达式会考虑单独的词来拆分它。如何修改我的正则表达式以将“-”视为一个词?简而言之,我希望在 Bone-in 之后进行拆分。

谢谢你。

标签: javaregexstringpunctuation

解决方案


您可以使用

(\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 示例

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

推荐阅读