Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何过滤阵列中既匹配模式又不匹配的元素';不符合第二种模式?_Arrays_Ruby_Regex - Fatal编程技术网

Arrays 如何过滤阵列中既匹配模式又不匹配的元素';不符合第二种模式?

Arrays 如何过滤阵列中既匹配模式又不匹配的元素';不符合第二种模式?,arrays,ruby,regex,Arrays,Ruby,Regex,我正在使用Ruby 2.4。我有以下表达式,仅用于在数组中保留与特定模式匹配的元素: lines.grep(/^[[:space:]]*\d+/) 如何编写一个Ruby表达式,使数组中的元素既匹配一个模式,又不匹配第二个模式?也就是说,我希望保留与上述内容匹配的元素,但也要排除与以下内容匹配的元素: /^[[:space:]]*\d+[:.]/ 如果我的数组仅包含元素“123 23:25”,则结果应包含此原始元素,因为它以一个不包含“:”或“.”的数字开头。请使用以下正则表达式: /^[[:

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

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++(?![:])/
      。请参见底部的“编辑”部分。请修改您的问题,并确保您发布了实际要求。请阅读“”。我们想要一个更好的例子来说明您正在尝试的内容,包括演示您尝试的内容的最小代码、最小的输入数据和预期的输出。我们不知道您的专业水平,因此我们必须编写一个教程,而不是调整您的代码。另外,请花点时间确保您的拼写和语法正确。