如何修复正则表达式使其仅返回标点及含标点的单词?
直接用正则匹配含标点的单词或纯标点符号
嘿,我来帮你优化这个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
相关产品推荐
相关产品推荐

