如果正则表达式不匹配,则从数组中删除元素

6

有没有办法做到这一点?

我有一个数组:

["file_1.jar", "file_2.jar","file_3.pom"]

我希望只保留“file_3.pom”,我的想法是这样的:

array.drop_while{|f| /.pom/.match(f)}

但是这种方式会将所有内容都存储在数组中,但是 "file_3.pom" 是否有一种方法可以实现“不匹配”?

我找到了以下内容:

f !~ /.pom/ # => leaves all elements in array

或者

f !~ /*.pom/ # => leaves all elements in array

但是没有一个返回我期望的结果。

1
你知道在 /.pom/ 中的 . 会匹配任何字符吗? - Stefan
顺便问一下,你的数组是从哪里来的? - Stefan
3个回答

8

那么 select 呢?

selected = array.select { |f| /.pom/.match(f) }
p selected
# => ["file_3.pom"]

希望能帮到你!

5

在您的情况下,您可以使用Enumerable#grep方法来获取与模式匹配的元素的数组:

["file_1.jar", "file_2.jar", "file_3.pom"].grep(/\.pom\z/)
# => ["file_3.pom"]

由于您可以看到,我还略微修改了您的正则表达式以仅匹配以 .pom 结尾的字符串:

  • \. 匹配一个字面上的句点,如果没有 \,它将匹配任何字符
  • \z 将模式锚定到字符串的末尾,如果没有它,模式将在字符串中匹配 .pom

由于您正在搜索字面字符串,因此您也可以完全避免使用正则表达式,例如使用方法 String#end_with?Array#select:

["file_1.jar", "file_2.jar", "file_3.pom"].select { |s| s.end_with?('.pom') }
# => ["file_3.pom"]

3
如果你想保留只响应正则表达式的字符串,那么可以使用 Ruby 方法 keep_if。但是这个方法会“破坏”主数组。
a = ["file_1.jar", "file_2.jar","file_3.pom"]
a.keep_if{|file_name| /.pom/.match(file_name)}
p a
# => ["file_3.pom"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接