0

我必须匹配文件中的一行并捕获行内容。该行如下:

key:value key:value abc:123

我有一段代码根据行内容处理文件中的不同行。上面的行可以通过行中出现的键“abc”来识别。我需要一个执行以下操作的正则表达式

  1. 检查行中是否存在“abc”
  2. 如果存在“abc”,则以数组的形式获取内容

我可以单独做这些

#gives me an array of the key,value pairs
array = line.scan(/\w+:\d+/) 
#matches "abc:value" but does not give me the other keys
/.*(abc:\d+)/.match(line)

寻找一种方法在一次操作中做到这一点

4

2 回答 2

1

怎么样:

array = line.scan(/\w+:\d+/) if line[/abc:\d+/]
于 2013-04-13T02:04:41.587 回答
1

不要把事情复杂化

正则表达式,尤其是一个单一的整体表达式,并不是解决所有问题的方法。即使有可能,过于复杂的表达式也不会使您的代码更具可读性或可维护性。除非你的雇主对每一行代码都向收费,否则不要害怕使用多行代码来表达一个概念。

使用条件表达式

您可以在语句中使用条件表达式在一行内进行匹配。例如:

line = 'key:value key:value abc:123'
line.scan /(\S+:\S+)/ if line =~ /abc:/
# => [["key:value"], ["key:value"], ["abc:123"]]

如果它首先匹配if语句中的条件,这只会将该行拆分为一个匹配数组。但是,请注意,您基本上仍然在进行两个正则表达式匹配。

如果您试图避免执行两个正则表达式匹配,可能是出于在紧密循环内的性能原因,您可以使用字符串模式匹配作为您的条件执行类似的操作。例如:

line = 'key:value key:value abc:123'
line.scan /(\S+:\S+)/ if line.include? 'abc:'
# => [["key:value"], ["key:value"], ["abc:123"]]

结果是一样的,但是String#scan使用正则表达式匹配,而条件使用String#include? . 后者可能更快。

于 2013-04-13T14:47:54.290 回答