正则表达式:
(?:(?:Jr|Master|Mr|Ms|Mrs|Dr|Capt|Col|Sgt|Sr|Prof|Rep|Mt|Mount|St|Etc|Eg)\.\s+|["'“(\[]?)(?:\b(?:(?!(?:\S{1,})[.?!]+["']?\s+["']?[A-Z]).)*)(?:(?:(?:Jr|Master|Mr|Ms|Mrs|Dr|Capt|Col|Sgt|Sr|Prof|Rep|Mt|Mount|St|Etc|Eg)\.\s+(?:(?!\w{2,}[.?!]['"]?\s+["']?[A-Z]).)*)?)*(?:(?![.?!]["']?\s+["']?\w).)*(?:[.?!)\]]+["'”]?|[^\r\n]+$)
可以看到regex101 here。
可视化节点图:https://regexper.com(输入正则表达式字符串)
此正则表达式来自Sitepoint讨论with an explanation here。
目标:不仅要通过。?!来匹配句子,还要确定何时这样做,例如在引用之外,而不是用缩写来破坏句子。
主要问题:
有一个主要问题,如下所示的字符串在它们不应该的时候在中间分裂,我需要引号保持完整。
问题:“这是一个问题。你听到了吗?”
除此之外,这个正则表达式是否可靠且高效?
可能还有其他两个问题,或“例外”(见上文regex101):
可能的问题/例句(由于“先生”而未正确分割): 2月20日,X先生说“超越第四道墙,应该有'光'”?!......或者其他东西。第二句话。第三
和
可能的问题/例外(“真的吗?”不应该在大写名字之前拆分?:“真的吗?”贝克先生问道,他继续思考。
我打开这个帖子时遇到的以前的问题我已修复,是:
在一个字母之后,文字没有拆分,然后是一个标点符号,并且在一个新句子之前进行了句号。 (例如A.S.A.P!新行。)
在报价后出现完整停止时,文本没有拆分。
句子开头的缩写会破裂。 (例如,蒂莫西中士。)
没有结束标点符号的新行未匹配。
您对此实施有何看法?谢谢!
答案 0 :(得分:1)
尝试用
找到句子(([0-9]+(\.[0-9]+)?[,;]?|([A-Z][bcdfghjklmnpqrstvwxyz]*\.)+[,;]?|[A-Za-z][a-z']*[,;]?)+(\s+|\.|[!?]))+
编辑:这是我最接近的。