我在PHP中有一个正则表达式,用空格替换了我不想要的所有内容
/[^a-z0-9\p{L}]/siu
但是有一个例外,我想保留缩写的标点符号。
示例:
F.B.I.Federal.Bureau.of.Investigation => 'F B I联邦局 调查'
S.W.A.T.Team => 'W W A T Team'
应该是:
F.B.I.Federal.Bureau.of.Investigation => '联邦调查局。联邦局 调查'
S.W.A.T.Team => '扑打。队
PHP代码:
$s = "F.B.I.Federal.Bureau.of.Investigation";
return preg_replace('/[^a-z0-9\p{L}]/siu', " ", $s);
所以逻辑是,它应该检查第一场比赛的第二个字符,如果它是'。' char,然后不要替换。 不确定这是否可以使用正则表达式,那么我将非常感谢使用PHP的替代方案。
答案 0 :(得分:0)
实际上,有许多类型的缩写,正如Jon Stirling所说,这里没有真正的100%工作解决方案,因为你需要一个可能的缩写列表来过滤掉。你可能会看一些fancy regex solution by @ndn并抓住与那里的缩写相关的模式部分。
如果您只需要处理问题中的模式,可以考虑使用
'~(\b(?:\p{Lu}\.){2,})|[^0-9\p{L}]~u'
或 - 如果D.Word
也应被视为缩写:
'~(\b(?:\p{Lu}\.)+)|[^0-9\p{L}]~u'
并替换为'$1 '
。请参阅regex demo。
模式详情:
(\b(?:\p{Lu}\.)+)
- 第1组(后来引用$1
反向引用):任意Unicode大写字母后面出现1个或多个,后面有一个点|
- 或[^0-9\p{L}]
- 任何不是ASCII数字和Unicode字母的字符。以下是带有@ndn缩写的正则表达式的变体:
'~\b((?:[Ee]tc|St|Gen|Hon|Prof|Dr|Mr|Ms|Mrs|[JS]r|Col|Maj|Brig|Sgt|Capt|Cmnd|Sen|Rev|Rep|Revd|pp|[Vv]iz|i\.?\s*e|[Vvol]|[Rr]col|maj|Lt|[Ff]ig|[Ff]igs|[Vv]iz|[Vv]ols|[Aa]pprox|[Ii]ncl|Pres|[Dd]ept|min|max|[Gg]ovt|lb|ft|c\.?\s*f|vs|\p{Lu}(?:\.\p{Lu})+)\.)|[^0-9\p{L}]~'
请参阅regex demo。
如果您不想删除-
,(
和)
,请务必将其添加到否定字符类中,将[^0-9\p{L}]
替换为{{1} }}
可以通过添加更多缩写来更新,也可以通过缩小备选方案来增强。