我非常清楚这是一个非常重要的问题。
我目前得到了这个:(.*?)(!,"\s|!,"$|\.\s|\.$|\!"?\s+?|\!"?$|\?"?\s+?|\?"?$|\."\s+?|\."$|…"\s+?|…"?$)
匹配各种行结束位和分割句子/段落。它做得非常好。
然而,鉴于句子:“你好,史密斯博士。你好吗?”我想将其拆分为:
我现有的解决方案会产生类似的内容:
对(负面)匹配有一整套致意:博士|教授|先生|太太|女士
任何想法如何做到这一点?
答案 0 :(得分:0)
我怀疑你在盯着一个兔子洞。如果您选择沿着这条路走下去,请为一些不可预见的挑战做好准备。
对于您最直接的要求,列出您的非拆分匹配项,然后使用 (*SKIP)(*FAIL)
丢弃这些匹配项并继续匹配应触发拆分点的字符串。
\K
将重置全字符串匹配。这意味着之前匹配的字符不会在爆炸中被移除。制作这些元素时只会消耗空白字符。
代码:(Demo)
$text = <<<TEXT
Dr. Di MacKusa is a doctor. Do you know her?!? She live on 1 Doctor Dr. Doctorsville in the U.S.A. Mr. MacKusa married Dr. Di.
TEXT;
var_export(
preg_split(
'~(?:Ms|Dr|Mrs?|Prof)\.(*SKIP)(*FAIL)|[?!.]+\K\s+~',
$text,
0,
PREG_SPLIT_NO_EMPTY
)
);
输出:
array (
0 => 'Dr. Di MacKusa is a doctor.',
1 => 'Do you know her?!?',
2 => 'She live on 1 Doctor Dr. Doctorsville in the U.S.A.',
3 => 'Mr. MacKusa married Dr. Di.',
)
有了更全面的示例文本,我可以改进我的模式。我的模式是一个相当简单的解决方案,我们还没有设计它来正确处理引用的文本。