Как я могу сопоставить предложение формы "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
Если по предложению вы имеете в виду что-то, что заканчивается знаком пунктуации, попробуйте это: (.*?)[.?!]
Объяснение:
-
.*
соответствует любой строке. Добавление?
делает его не-жадным сопоставлением (соответствует наименьшей возможной строке) -
[.?!]
соответствует любой из трех знаков препинания