Arrays 如何过滤阵列中既匹配模式又不匹配的元素';不符合第二种模式?
我正在使用Ruby 2.4。我有以下表达式,仅用于在数组中保留与特定模式匹配的元素:Arrays 如何过滤阵列中既匹配模式又不匹配的元素';不符合第二种模式?,arrays,ruby,regex,Arrays,Ruby,Regex,我正在使用Ruby 2.4。我有以下表达式,仅用于在数组中保留与特定模式匹配的元素: lines.grep(/^[[:space:]]*\d+/) 如何编写一个Ruby表达式,使数组中的元素既匹配一个模式,又不匹配第二个模式?也就是说,我希望保留与上述内容匹配的元素,但也要排除与以下内容匹配的元素: /^[[:space:]]*\d+[:.]/ 如果我的数组仅包含元素“123 23:25”,则结果应包含此原始元素,因为它以一个不包含“:”或“.”的数字开头。请使用以下正则表达式: /^[[:
lines.grep(/^[[:space:]]*\d+/)
如何编写一个Ruby表达式,使数组中的元素既匹配一个模式,又不匹配第二个模式?也就是说,我希望保留与上述内容匹配的元素,但也要排除与以下内容匹配的元素:
/^[[:space:]]*\d+[:.]/
如果我的数组仅包含元素
“123 23:25”
,则结果应包含此原始元素,因为它以一个不包含“:”或“.”的数字开头。请使用以下正则表达式:
/^[[:space:]]*\d++(?![:.])/
看
在这里,^[[:space:]*
部分与第一个正则表达式中相同,\d++
将占有地匹配1+位(因此,禁用回溯),并且(?![:。])
如果这些1+位后面跟有:
或,则任何匹配都将失败
详细信息:
^
-行的开头
[[:space:][]*
-(可替换为\s*
)-0+空格字符
\d++
-1+个数字以占有方式匹配,因此无法回溯到模式中
(?![:。])
-如果在当前位置的右侧(1+位之后)立即找到:
或
,则匹配失败的负前瞻
回答您问题的一般情况
试试这个
lines.select { |each| each =~ first_pattern && each !~ second_pattern }
或者如果您使用Ruby 2.3+
lines.grep(first_pattern).grep_v(second_pattern)
grep\u v
的名称是受grep-v
命令行选项启发而来的。谢谢,但这不起作用。如果我的数组只包含元素“123 23:25”,则运行linese.grep(/^(?。*\d[:。])[[:space:]*\d+/)将导致一个空数组。根据我的要求,它至少应该包含原始元素,因为原始元素以一个不包含“:”或“.”的数字开头。嗨,Cary,我想尝试一下你的建议,但要运行lines。grep(/^[:space:]*\d+(?![:。])/)当lines为[“12:25 1234”]时返回[“12:25 1234”]即使我不想。请看我的编辑。您需要\d++
,一个带有\d
的++
所有格量词。谢谢您的更新。我尝试了你的新表达式lines.grep(/^(?。*\d[:。])[:space:]*\d++),但是如果lines是[“1234 12:25”],则不会返回任何内容,即使元素应该返回,因为它以数字开头,而不是以“:”开头的数字。我的新建议是/^[:space:]*\d++(?![:])/
。请参见底部的“编辑”部分。请修改您的问题,并确保您发布了实际要求。请阅读“”。我们想要一个更好的例子来说明您正在尝试的内容,包括演示您尝试的内容的最小代码、最小的输入数据和预期的输出。我们不知道您的专业水平,因此我们必须编写一个教程,而不是调整您的代码。另外,请花点时间确保您的拼写和语法正确。