如何使这个正则表达式更通用?
How do I make this regular expression more general?
我正在使用 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
.
如果不想将输出限制为包含 |lan
的行,则不能在表达式中包含 |lan
。您似乎希望 |lan
标记捕获组的结尾 - 相反,您可以使用字符集 [^|]
将捕获组限制为不包含 |
。然后,即使该行不包含 lan
,您也会在第一个 |
处停止。在 |
之后,您直到 puppetagent
才关心内容,因此我们将使用 .*
。
/^"([^|]*).*puppetagent/
用简单的英语来说,就是
^"
从 "
开始
([^|]*)
捕获任何不是 |
的东西
.*
接受就行了
puppetagent
要求 puppetagent
出席
我正在使用 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
.
如果不想将输出限制为包含 |lan
的行,则不能在表达式中包含 |lan
。您似乎希望 |lan
标记捕获组的结尾 - 相反,您可以使用字符集 [^|]
将捕获组限制为不包含 |
。然后,即使该行不包含 lan
,您也会在第一个 |
处停止。在 |
之后,您直到 puppetagent
才关心内容,因此我们将使用 .*
。
/^"([^|]*).*puppetagent/
用简单的英语来说,就是
^"
从"
开始
([^|]*)
捕获任何不是|
的东西
.*
接受就行了puppetagent
要求puppetagent
出席