Регулярное выражение соответствует предложению

Как я могу сопоставить предложение формы "Hello world" или "Hello World". Предложение может содержать "-/digit 0-9". Любая информация будет очень полезной для меня. Спасибо.

Ответ 1

Это будет очень хорошая работа. Мое определение предложения: предложение начинается с не-пробелов и заканчивается периодом, восклицательным знаком или вопросительным знаком (или концом строки). После окончания пунктуации может быть закрывающая цитата.

[^.!?\s][^.!?]*(?:[.!?](?!['"]?\s|$)[^.!?]*)*[.!?]?['"]?(?=\s|$)

import java.util.regex.*;
public class TEST {
    public static void main(String[] args) {
        String subjectString = 
        "This is a sentence. " +
        "So is \"this\"! And is \"this?\" " +
        "This is 'stackoverflow.com!' " +
        "Hello World";
        String[] sentences = null;
        Pattern re = Pattern.compile(
            "# Match a sentence ending in punctuation or EOS.\n" +
            "[^.!?\\s]    # First char is non-punct, non-ws\n" +
            "[^.!?]*      # Greedily consume up to punctuation.\n" +
            "(?:          # Group for unrolling the loop.\n" +
            "  [.!?]      # (special) inner punctuation ok if\n" +
            "  (?!['\"]?\\s|$)  # not followed by ws or EOS.\n" +
            "  [^.!?]*    # Greedily consume up to punctuation.\n" +
            ")*           # Zero or more (special normal*)\n" +
            "[.!?]?       # Optional ending punctuation.\n" +
            "['\"]?       # Optional closing quote.\n" +
            "(?=\\s|$)", 
            Pattern.MULTILINE | Pattern.COMMENTS);
        Matcher reMatcher = re.matcher(subjectString);
        while (reMatcher.find()) {
            System.out.println(reMatcher.group());
        } 
    }
}

Вот результат:

This is a sentence.
So is "this"!
And is "this?"
This is 'stackoverflow.com!'
Hello World

Соответствие всех этих правильных значений (с последним предложением без конечной пунктуации) оказывается не таким простым, как кажется!

Ответ 2

Если по предложению вы имеете в виду что-то, что заканчивается знаком пунктуации, попробуйте это: (.*?)[.?!]

Объяснение:

  • .* соответствует любой строке. Добавление ? делает его не-жадным сопоставлением (соответствует наименьшей возможной строке)
  • [.?!] соответствует любой из трех знаков препинания