3

我正在尝试提出一个正则表达式来删除所有包含非单词字符的单词。

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

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

不必是完美的,所以用破折号和撇号删除字符串是可以的。

4

3 回答 3

3
$wordline = join(" ", grep(/^\w+$/, split(/\s+/, $wordline)));
于 2009-04-03T17:34:59.667 回答
2
s/\w*([^\w\s]|\d)+\w* ?//g;
于 2009-04-03T17:08:52.303 回答
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
于 2009-04-03T18:14:07.263 回答