如何过滤数组中与模式匹配且与第二个模式不匹配的元素?

时间:2017-01-23 22:35:09

标签: arrays ruby regex

我正在使用Ruby 2.4。我有以下表达式,仅用于保持数组中与某个模式匹配的元素:

lines.grep(/^[[:space:]]*\d+/)

如何编写一个Ruby表达式,使数组中的元素与模式匹配并且与第二个模式不匹配?也就是说,我想保留与上面匹配的元素,但是也要排除匹配的元素:

/^[[:space:]]*\d+[:.]/

如果我的数组只包含元素" 123 23:25 ",则结果应包含此原始元素,因为它以不包含“:”或“。”的数字开头。在它之后。

2 个答案:

答案 0 :(得分:1)

使用以下正则表达式:

/^[[:space:]]*\d++(?![:.])/

请参阅this regex demo

此处^[[:space:]]*部分与第一个正则表达式相同,\d++将占据1+位数(因此,停用回溯),(?![:.])将失败任何匹配,如果这些1 +数字后跟:.

<强>详情:

  • ^ - 开始行
  • [[:space:]]* - (可能会替换为\s*) - 0+空格字符
  • \d++ - 1+位数符合占有率,因此无法回溯到模式
  • (?![:.]) - 如果在当前位置的右侧(1位数字后面)找到:.,则会导致匹配失败的否定前瞻。

答案 1 :(得分:0)

回答你问题的一般情况。

试试这个

lines.select { |each| each =~ first_pattern && each !~ second_pattern }

或者如果您使用Ruby 2.3 +

lines.grep(first_pattern).grep_v(second_pattern)

grep_v的名称受grep -v命令行选项的启发。