如何从包含非字母表字符的字符串中删除整个单词?
修改但是,'
和-
应该是字母表旁边唯一允许的字符。
例如:This is a? #test e3ample
成为:This is
我找到的解决方案专注于从字符串而不是整个单词中删除特定字符。
我尝试创建一个带有禁止字符的数组,但这是不好的做法。我怎么用Regex这样做?或类似的东西。
答案 0 :(得分:1)
我们可以尝试使用以下模式进行正则表达式替换:
(?=[^ ]*[^A-Za-z \'-])([^ ]*)(?:\\s+|$)
这使用前瞻来检查每个单词是否包含非alpha字符。如果是这样,那么它将删除整个单词。还允许使用破折号和单引号。
$input = "H3llo This is a? #test e3ample of a sentence-word bl&h.";
echo preg_replace('/(?=[^ ]*[^A-Za-z \'-])([^ ]*)(?:\\s+|$)/', '', $input);
This is of a sentence-word
修改强>
如果在将来某个时候你需要在列表中添加允许的字符(除了破折号和单撇号),那么只需将它们添加到字符类中即可。例如。也允许句号和逗号然后使用这种模式:
(?=[^ ]*[^A-Za-z \'.,-])([^ ]*)(?:\\s+|$)
答案 1 :(得分:0)
只需为不符合" word"的连续字符写一个匹配项定义,例如:
\S*
[^-a-z\s]
加空格\S*
诀窍是任何非空格字符串都会匹配,只要它确实包含一个不在允许集合中的字符。
答案 2 :(得分:0)
通过我的测试,这种模式最简洁,因为它避免了外观和捕获组。如果它不适用于所有情况,请向我发送打破它的字符串。
演示:https://regex101.com/r/h9w3xn/5
模式:
/\S*[^a-z '-]\S* | \S*[^a-z '-]\S*/i
(无替换字符串)
这将匹配无效的子字符串以及前导或尾随空格(但绝不是两者)以生成干净的输出字符串。
有人可能会评论说这不是一个非常干燥的模式,因为它会重复,但优点是:效率,我认为可读性。
接听我的电话;如果我错了,请纠正我。