由於天真的方法適合你,我發佈了一個答案。但是,請注意,檢測句子結束對於正則表達式來說是一項非常困難的任務,儘管可能在某種程度上可能會使用NLP包。
說了這麼多,我建議使用
'~(?<!\be\.g)\.(?=\s+\p{Lu})~ui'
正則表達式是不是前面有一個完整的單詞e.g
任何點(\.
)匹配(見負回顧後(?<!\be\.g)
),但隨後用1或更多空格(\s+
)後跟1個大寫Unicode字母\p{Lu}
。
見regex demo
不區分大小寫i
修改不會影響什麼\p{Lu}
匹配。
由於您使用的是Unicode文本(如俄語),因此需要使用~u
修飾符。
要獲得第一個匹配項的索引,請使用帶有PREG_OFFSET_CAPTURE
標誌的preg_match
函數。這裏是你的意見提供了一下簡化的正則表達式:
preg_match('~(?<!т\.н)(?<!т\.к)(?<!e\.g)\.(?=\s+\p{L})~iu', $text, $match, PREG_OFFSET_CAPTURE);
見向前看符號被逐一執行,並在字符串中的同一個位置,因此,你不必爲正向前查找裏面另外它們分組。請參閱regex demo。
IDEONE demo:
$re = '~(?<!т\.н)(?<!т\.к)(?<!e\.g)\.(?=\s+\p{L})~iu';
$str = "cats, e.g. Barsik, are funny. And it is true. So,";
preg_match($re, $str, $match, PREG_OFFSET_CAPTURE);
echo $match[0][1];
你的標題是誤導性的,因爲你需要匹配的第一個句號表示句子的結束。這是一種天真的做法:'〜(?<!\ be \ .g)\。(?= \ s + \ p {Lu})〜''(用於'preg_match')。但是,您可能需要某種NLP包。 –
@WiktorStribiżew,謝謝 – mnv
還有其他縮寫,這不適用於所有情況。 –