【问题标题】:How can I remove all tokens with non-word characters in Perl?如何在 Perl 中删除所有带有非单词字符的标记?
【发布时间】:2009-04-03 17:01:12
【问题描述】:

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

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

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

不必完美,因此可以删除带有破折号和撇号的字符串。

【问题讨论】:

  • 一个单词怎么可能包含非单词字符?
  • 在正则表达式的上下文中,“非单词”字符包括连字符(例如,快速说话)和撇号(例如,不要)。

标签: regex perl pcre


【解决方案1】:
$wordline = join(" ", grep(/^\w+$/, split(/\s+/, $wordline)));

【讨论】:

  • 这就是我要做的。但是请注意,\w 也包含下划线 _。如果你不想这样,只需指定你自己的字符类。
  • OP 在下面还说他不想要数字,所以你只需要 /^[A-Za-z]+$/ (或 Unicode 感知等价物)。
  • 还有一个警告:根据令牌的拆分方式,Brian G 可能希望保留拆分字符的原样。您的解决方案将所有标记分隔符更改为 .
【解决方案2】:
s/\w*([^\w\s]|\d)+\w* ?//g;

【讨论】:

  • 为什么不用 \W 而不是 ^\w?只是好奇是否有特定原因。
  • 是的,\W 捕捉空格,^\w\s 不捕捉。
  • @Telemachus:因为他还想排除空格字符。 \W 将包含空格。
  • 这行得通,只是它仍然保留包含数字的字符串
  • 是的,我忽略了数字。已更正。
【解决方案3】:
s/(?<!\S)(?![A-Za-z]+(?:\s|$))\S+(?!\S)//g

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

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

  • 前面没有:(?&lt;!\S),后面没有:(?!\S),后面是非空白字符

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

这将留下它删除的单词周围的所有空格。正确处理这些问题比您想象的要复杂一些。在单独的步骤中执行起来要容易得多,例如:

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

【讨论】:

  • [A-Za-z] 不处理 Unicode,您可能想使用 [[:alpha:]] 代替。
  • 我申请了教师执照。 :) 使用 [A-Za-z] 非常清楚您匹配的是什么(以及您不匹配的是什么)。顺便说一句, [[:alpha:]] 也不处理 Unicode;它是 POSIX 语言中的“在底层平台的语言环境中归类为字母的事物”。
猜你喜欢
  • 1970-01-01
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
相关资源
最近更新 更多