You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复正则表达式使其仅返回标点及含标点的单词?

直接用正则匹配含标点的单词或纯标点符号

嘿,我来帮你优化这个Ruby代码!你现在是先把所有单词和标点拆分出来,再筛选带标点的内容,其实咱们可以直接修改正则表达式,一步到位拿到你想要的结果,不用再额外做筛选啦。

先看你的示例字符串:

"The man's hat is really, very nice."

原来的代码会先拆分出["The", "man's", "hat", "is", "really", ",", "very", "nice", "."],再筛选出带标点的["man's", ",", "."]。现在咱们直接改正则,让scan一步返回这个结果:

class String
  def words_with_punctuation_or_punctuation
    # 匹配两种情况:带标点的单词 或者 纯标点序列
    scan(/(?:[\w'-]*[[:punct:]][\w'-]*|[[:punct:]]+)/)
  end
end

调用这个方法测试示例字符串,就能直接得到["man's", ",", "."],完美符合需求!

给你拆解下这个正则的逻辑:

  • (?:...):这是个非捕获分组,用来把两个匹配规则打包在一起,不会产生多余的捕获结果;
  • [\w'-]*[[:punct:]][\w'-]*:专门匹配包含至少一个标点的单词类序列——不管标点在开头(比如'hello)、中间(比如man's)还是结尾(比如really,)都能命中;
  • |:逻辑“或”,满足左边或者右边的规则都能匹配;
  • [[:punct:]]+:匹配连续的纯标点符号,比如单独的逗号、句号,或者多个连在一起的标点(比如!!?)。

这样一来,你就不用再调用select(&:punctuation?)做二次筛选了,一步到位拿到目标内容,代码更简洁高效~

内容的提问来源于stack exchange,提问作者chell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:34:45