Разделение строки в регулярном выражении с одним словом - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь разбить предложение на 32 символа в каждой группе регулярных выражений.Предложение разделяется после полного слова, если 32-й символ является буквой в слове.Когда мои входные данные представляют собой предложение, которое имеет «-», оно также разделяет это слово.

Это регулярное выражение, которое я использую

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

Входная строка:

Половина костяной спирали с темной упаковкой Смитфилд Половина спиральной ветчины с глазурью

результирующие группы:

  1. Половина костной спиралис
  2. темный Packd Smithfield Half Bone-
  3. в спиральной ветчине с пакетом глазури

В вышеприведенном разделении "Bone-in" - это одно слово, но регулярное выражениеразбивает это, рассматривая отдельные слова.Как я могу изменить свое регулярное выражение, чтобы рассматривать «-» как одно слово?Короче говоря, я хочу раскол после Bone-in.

Спасибо.

1 Ответ

0 голосов
/ 09 декабря 2018

Вы можете использовать

(\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, ]
...