プレスを止めろ!
編集した質問によると、このプロジェクトでは PHP または ActionScript のいずれかを使用しています。これは、これまでに提供されたソリューションのどれも役に立たないことを意味します。元の正規表現は遅すぎるだけでなく、ターゲット プラットフォームではまったく機能しません。Regex Powertoy サイトで機能する理由は、そのサイトが Java regex フレーバーを使用しており、後読みに対する制限が緩いためです。
後読みは、正規表現機能の中でも厄介者のようなものです。ほとんどすべてのフレーバーは、1 つのフレーバーで使用できる式の種類に制限を課します。たとえば、Perl や Python では、式は固定長である必要があります。(?<!St)
は動作しますが(?<!Sgt|Rev)
、動作し(?<!St|Sgt)
ません。Java ははるかに寛大です。可能な最大長が事前に決定できる限り、可変長の後読み式を受け入れるため、(?<!St|Sgt)
と同様に機能しますが(?<!\w{3,12})
、機能し(?<!\w+)
ません。
PHP と ActionScript の正規表現はどちらも PCRE ライブラリによって強化されています。これは、後読みに関して Perl や Python よりもわずかに緩いだけです。後読み式が代替の場合、各代替の長さは固定する必要がありますが、すべてが同じ長さである必要はありません。ただし、これは正規表現の最上位の「レベル」でのみ許可されます。つまり、後読みは別のグループ化構造を含むことも、1 つに含めることもできません。
これが、これまでに提供されたすべてのソリューションを機能させない部分です。グループ化の制限を回避するために、 と のチェックを に結合し、.
と!
を選択肢に分配する必要がありました。?
[.!?]
\b
\.
/([.!?])(?<!\bSt\.|\bSgt\.|\bRev\.|\bLtd\.|\bInc\.|\bLt\.|\bJr\.|\bSr\.|\bEsq\.|\bInst\.|\bHon\.|\bGen\.|\bCpl\.|\bComdr\.|\bCol\.|\bCorp\.|\bMr\.|\bDr\.|\bGov\.|\bMrs\.|\bMs\.|\b[A-Z]\.|\bAssn\.|\bCapt\.)(?:\s*$|\s+(?:[_$#]|[A-Z][^.]))/
これにより、プローブ数が2208まで増加しますが、これは最初の数よりも 1 桁優れています。それが数GBのテキストに対して十分に速いかどうかはわかりません。
編集:あなたのコメントでは、タイトルを長さでグループ化することを提案しましたが、うまくいきませんでした。しかし、さらに一歩進んで、これらのグループのそれぞれを独自の後読みに配置すると、(驚いたことに)うまくいくように見えます。フリースペース モードでの表示は次のとおりです。
/(?:
\.
(?<!\bComdr\.)
(?<!(?=\b[A-Z])(?:Assn|C(?:apt|orp)|Inst)\.)
(?<!(?=\b[A-Z])(?:C(?:ol|pl)|Esq|G(?:en|ov)|Hon|Inc|Ltd|Mrs|Rev|Sgt)\.)
(?<!(?=\b[A-Z])(?:Dr|Jr|Lt|M[rs]|S[rt])\.)
(?<!\b[A-Z]\.)
|
[!?]
)
(?:\s*$|\s+(?:[_$#]|[A-Z][^.]))
/x
実際の動作を確認するには、ideone.com の PHP デモをチェックしてください。