如何删除Perl中包含非单词字符的所有标记?

时间:2009-04-03 17:01:13

标签: regex perl pcre

我正在尝试使用正则表达式删除包含非单词字符的所有单词。

因此,如果它包含冒号,逗号,数字,括号等,则将其从行中删除,而不仅仅是字符而是单词。到目前为止,我有这个。

$wordline = s/\s.*\W.*?\s//g;

不一定要完美,所以用短划线和撇号删除字符串是可以的。

3 个答案:

答案 0 :(得分:3)

$wordline = join(" ", grep(/^\w+$/, split(/\s+/, $wordline)));

答案 1 :(得分:2)

s/\w*([^\w\s]|\d)+\w* ?//g;

答案 2 :(得分:2)

s/(?<!\S)(?![A-Za-z]+(?:\s|$))\S+(?!\S)//g

在regex-land中,“单词字符”是字母,数字或下划线([A-Za-z0-9_])。听起来你用它来表示字母,所以\w\W对你没有任何好处。我的正则表达式匹配:

  • 一堆非空白字符:\S+

  • 之前没有:(?<!\S)或跟随:(?!\S)非空白字符

  • 除非所有字符都是字母:(?![A-Za-z]+(?:\s|$))

这将留下它删除的单词周围的所有空格。正确处理这些比你想象的要复杂一些;在单独的步骤中更容易做到,例如:

s/^ +| +(?= |$)//g