Java регулярное выражение хитрый шаблон - PullRequest
0 голосов
/ 02 октября 2011

Я застрял на некоторое время с регулярным выражением, которое делает мне следующее:

  • разделить мои предложения с этим: "[\ W +]"
  • но если он находит слово, подобное этому: «ааа-аа» (не «ааа-аа» или «ааа-ааа-аа»), слово не расщепляется, а целое слово *

    По сути, я хочу разделить предложения по словам, но также и слово "ааа-аа" - это слово. Я успешно сделал это, создав две отдельные функции: одну для разделения с \ w, а другую для поиска слов типа "aaa-aa". Наконец, я затем добавляю оба и вычитаю каждое составное слово.

    Например, предложение:

    «Привет, меня зовут Ричард»

    Сначала я собираю {Привет, меня зовут, Ричард} тогда я собираю {мое имя} затем я добавляю {my-name} в {Hello, my, name, is, Richard} затем я вынимаю {my} и {name} здесь {Здравствуйте, my, name, is, Richard}. результат: {Привет, меня зовут, Ричард}

    этот подход делает то, что мне нужно, но для разбора больших файлов это становится слишком тяжелым, потому что для каждого предложения требуется слишком много копий. Итак, мой вопрос, есть ли что-нибудь, что я могу сделать, чтобы включить все в один шаблон? Как:

    «разбить мне текст по этому шаблону» [\ W +], но если вы найдете слово, подобное этому «ааа-аа», считайте это словом, а не двумя словами.

Ответы [ 5 ]

0 голосов
/ 02 октября 2011

Если вы хотите использовать split (), а не явно сопоставлять слова, которые вас интересуют, следующее должно делать то, что вы хотите: [\s-]{2,}|\s Чтобы разбить это, вы сначала разбиваетесь на два или более пробелов и / илидефисы - поэтому один «-» не будет совпадать, поэтому «один-два» останется один, но что-то вроде «один - два», «один - два» или даже «один - --- - два» будетразделить на «один» и «два».Это все еще оставляет «нормальный» случай одного пробела - «один два» - несопоставимым, поэтому мы добавляем или ('|'), за которым следует один пробел (\ s).Обратите внимание, что порядок альтернатив важен - подвыражения RE разделены '|'оцениваются слева направо, поэтому сначала нужно поставить альтернативу пробелам и дефисам.Если бы мы делали это наоборот, то, когда мы получили что-то вроде 'one -two', мы бы сопоставили первый пробел и вернули 'one', '-two'.

Если вы хотите играть в интерактивном режимевокруг с RE Java, я могу полностью порекомендовать http://myregexp.com/signedJar.html, который позволяет вам редактировать RE и видеть его соответствие с образцом строки при редактировании RE.

0 голосов
/ 02 октября 2011

Я не уверен, сработает ли этот шаблон, потому что у меня нет инструментов разработчика для Java, вы можете попробовать его, хотя он использует вычитание класса символов, которое, насколько я знаю, поддерживается только в Java regex: 1001 *

[\W&&[^-]]+

это означает совпадение символов, если они [\ W] и [^ -], то есть символы [\ W], а не [-].

0 голосов
/ 02 октября 2011

Почти то же регулярное выражение, что и в вашем предыдущем вопросе :

String sentence = "Hello my-name is Richard";
Pattern pattern = Pattern.compile("(?<!\\w)\\w+(-\\w+)?(?!\\w)");
Matcher matcher = pattern.matcher(sentence);
while (matcher.find()) {
    System.out.println(matcher.group());
}

Только что добавили опцию (...)?, чтобы также соответствовать не зарезервированным словам.

0 голосов
/ 02 октября 2011

Ваше описание недостаточно ясно, но почему бы просто не разделить его на пробелы?

0 голосов
/ 02 октября 2011

Почему бы не использовать шаблон \\s+? Это делает именно то, что вы хотите без каких-либо хитростей: разбивает текст по словам, разделенных пробелами.

...