如何从文本中删除所有字母数字单词?
Posted
技术标签:
【中文标题】如何从文本中删除所有字母数字单词?【英文标题】:How to remove all alphanumeric words from the text? 【发布时间】:2015-02-24 23:18:06 【问题描述】:我正在尝试在 php 中编写正则表达式,它只会删除字母数字单词(包含数字的单词),但不会删除具有 punctuation 和类似特殊字符的数字(例如价格、电话数字等)。
应该删除的词:
1st
、H20
、2nd
、O2
、3rd
、NUMB3RS
、Rüthen1
、Wrocław2
不应该删除的词:
0
,5.5
,10
,$100
,£65
,+44
,(20)
,123
,ext:124
,4.4-BSD
,
这是目前为止的代码:
$text = 'To remove: 1st H20; 2nd O2; 3rd NUMB3RS; To leave: Digits: -2 0 5.5 10, Prices: $100 or £65, Phone: +44 (20) 123 ext:124, 4.4-BSD';
$pattern = '/\b\w*\d\w*\b-?/';
echo $text, preg_replace($pattern, " ", $text);
但是它会删除所有单词,包括数字、价格和电话。
到目前为止,我还尝试了以下模式:
/(\\s+\\w1,2(?=\\W+))|(\\s+[a-zA-Z0-9_-]+\\d+)/ # Removes digits, etc.
/[^(\w|\d|\'|\"|\.|\!|\?|;|,|\\|\/|\-|:|\&|@)]+/ # Doesn't work.
/(\\s+\\w1,2(?=\\W+))|(\\s+[a-zA-Z0-9_-]+\\d+)/ # Removes too much.
/[^\pL\pN-]+/u # It removes only special characters.
/(^[\D]+\s|\s[\D]+\s|\s[\D]+$|^[\D]+$)+/ # Removes words.
/ ?\b[^ ]*[0-9][^ ]*\b/i # Almost, but removes digits, price, phone.
/\s+[\w-]*\d[\w-]*|[\w-]*\d[\w-]*\s*/ # Almost, but removes digits, price, phone.
/\b\w*\d\w*\b-?/ # Almost, but removes digits, price, phone.
/[A-Za-z0-9]*[A-Za-z][A-Za-z0-9]*/ # Almost, but removes too much.
我在 SO(它们中的大多数通常过于具体)和其他假设删除带有数字的单词的网站上发现的,但事实并非如此。
如何编写一个简单的正则表达式,可以在不涉及其他内容的情况下删除这些单词?
示例文本:
删除:
1st
H20
;2nd
O2
;3rd
NUMB3RS
;离开:数字:-2 0 5.5 10,价格:100 美元或 65 英镑,电话:+44 (20) 123 分机:124, 4.4-BSD
预期输出:
删除:; ; ;离开:数字:-2 0 5.5 10,价格:100 美元或 65 英镑,电话:+44 (20) 123 分机:124, 4.4-BSD
【问题讨论】:
我会对空格进行拆分以获取单词数组,然后用数字检查每个单词是否包含特殊字符,如果是,则从数组中删除,然后用空格将数组内爆为胶水。它不是正则表达式,但它会更容易正确。 你期望的输入和输出是什么?你能举个简短的例子吗? @hek2mgl 我已经添加了预期的输出。 您需要(准确地)定义您的意思:“特殊字符”。 【参考方案1】:将\b(?=[a-z]+\d|[a-z]*\d+[a-z]+)\w*\b\s*
替换为空怎么样?
演示:https://regex101.com/r/jA2fW3/1
图案代码:
$pattern = '/\b(?=[a-z]+\d|[a-z]*\d+[a-z]+)\w*\b\s*/i';
要匹配包含外国/重音字母的字母数字单词,请使用以下模式:
$pattern = '/\b(?=[\pL]+\d|[\pL]*\d+[\pL]+)[\pL\w]*\b\s*/i';
演示:https://regex101.com/r/jA2fW3/3
【讨论】:
工作得很好,但是诸如Rüthen1
、Wrocław2
之类的词被删除了一半。我知道它没有在描述中预测,但很高兴拥有。我尝试为 Unicode 添加 u
修饰符,但没有按预期工作。我会尝试寻找一些解决方案。
我尝试用\pL
替换a-z
的所有实例(以匹配来自任何语言的任何类型的字母),但它似乎无法正常工作,但是这种方法有效在 hwnd 的例子中。
@kenorb 很高兴你让它工作了,虽然我能让我的工作regex101.com/r/jA2fW3/3。【参考方案2】:
您可以如下修改正则表达式以获得所需的输出。
$text = preg_replace('/\b(?:[a-z]+\d+[a-z]*|\d+[a-z]+)\b/i', '', $text);
要匹配来自任何语言的任何类型的字母,请使用 Unicode 属性\pL
:
$text = preg_replace('/\b(?:\pL+\d+\pL*|\d+\pL+)\b/u', '', $text);
【讨论】:
以上是关于如何从文本中删除所有字母数字单词?的主要内容,如果未能解决你的问题,请参考以下文章