如何按句点拆分字符串但忽略称呼?

时间:2013-01-08 17:18:26

标签: php regex

我非常清楚这是一个非常重要的问题。

我目前得到了这个:(.*?)(!,"\s|!,"$|\.\s|\.$|\!"?\s+?|\!"?$|\?"?\s+?|\?"?$|\."\s+?|\."$|…"\s+?|…"?$)匹配各种行结束位和分割句子/段落。它做得非常好。

然而,鉴于句子:“你好,史密斯博士。你好吗?”我想将其拆分为:

  1. 你好,史密斯博士。
  2. 你好吗?
  3. 我现有的解决方案会产生类似的内容:

    1. 你好,博士。
    2. 史密斯。
    3. 你好吗?
    4. 对(负面)匹配有一整套致意:博士|教授|先生|太太|女士

      任何想法如何做到这一点?

1 个答案:

答案 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.',
)

有了更全面的示例文本,我可以改进我的模式。我的模式是一个相当简单的解决方案,我们还没有设计它来正确处理引用的文本。