我正在使用Ruby 2.4。我有以下表达式,仅用于保持数组中与某个模式匹配的元素:
lines.grep(/^[[:space:]]*\d+/)
如何编写一个Ruby表达式,使数组中的元素与模式匹配并且与第二个模式不匹配?也就是说,我想保留与上面匹配的元素,但是也要排除匹配的元素:
/^[[:space:]]*\d+[:.]/
如果我的数组只包含元素" 123 23:25 "
,则结果应包含此原始元素,因为它以不包含“:”或“。”的数字开头。在它之后。
答案 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
命令行选项的启发。