如何使这个正则表达式更通用?

时间:2016-01-08 15:09:10

标签: ruby regex ruby-1.8.7

我正在使用Ruby 1.8.7。我有一个包含以下内容的文本文件:

"testhost-01.test.de|lan|ip-v4|cmk-agent|tcp|ip-v4-only|site:tir_projects|test|wato|/" + FOLDER_PATH + "/",
"testhost-02.test.de|lan|ip-v4|cmk-agent|tcp|ip-v4-only|site:tir_projects|prod|puppetagent|wato|/" + FOLDER_PATH + "/",
"testhost-03.test.de|wan|ip-v4|cmk-agent|tcp|ip-v4-only|site:tir_projects|prod|puppetagent|wato|/" + FOLDER_PATH + "/",
"testhost-04.test.de|ip-v4|cmk-agent|tcp|ip-v4-only|site:tir_projects|dmz|prod|puppetagent|wato|/" + FOLDER_PATH + "/",
"testhost-05.test.de|wan|ip-v4|cmk-agent|tcp|ip-v4-only|site:tir_projects|prod|puppetagent|wato|/" + FOLDER_PATH + "/",
"testhost-06.test.de|lan|ip-v4|cmk-agent|tcp|ip-v4-only|site:tir_projects|prod|wato|/" + FOLDER_PATH + "/",
"testhost-07.test.de|ip-v6|cmk-agent|tcp|site:tir_projects|ip-v6-only|dmz|prod|puppetagent|wato|/" + FOLDER_PATH + "/",
"testhost-08.test.de|ip-v4|snmp|snmp-only|ip-v4-only|critical|site:tir_projects|dmz|wato|/" + FOLDER_PATH + "/",

我正在尝试将主机名(testhost-01.test.de - testhost-08.test.de)提取到数组,但仅当"puppetagent"位于同一行时。

结果应为:

[
  "testhost-02.test.de",
  "testhost-03.test.de",
  "testhost-04.test.de",
  "testhost-05.test.de",
  "testhost-07.test.de"
]

代码示例:

path = "Textfile"
file = IO.read(path)
nodes = file.scan(/^"(.*)\|lan.*\|puppetagent/).flatten 

上面的示例仅适用于第一个管道之后的行, “lan”跟随,因此它只找到主机02

1 个答案:

答案 0 :(得分:3)

如果您不想将输出限制为包含|lan的行,则不能在表达式中包含|lan。看起来您希望|lan标记捕获组的结尾 - 相反,您可以使用字符集|将捕获组限制为不包括[^|]。然后,即使该行不包含lan,您也会在第一个|处停止。在|之后,您不会在puppetagent之前关注内容,因此我们会使用.*消费内容。

/^"([^|]*).*puppetagent/

用简单的英语,那是

  • ^""
  • 开始
  • ([^|]*)捕获任何不属于|
  • 的内容
  • .*接受其他任何内容
  • puppetagent要求puppetagent出席