[英]pcre_regex with conditional patterns, "or" and "and" conditions
我正在使用pcre-regex-engine來匹配我的文件/行中的模式。 我試圖找到匹配的行是:
line-001 key_one:10.20.30.40 any data goes here
line-002 key_two:11.22.33.44 any data goes here
line-003 key_off:12.32.42.52 any data goes here
line-004 key_ten:34.45.67.89 any data goes here
現在,我想匹配以key_one:
、 key_two:
或key_ten:
開頭的 ip 模式。 我需要我的模式是有條件的,“匹配以key_one:
或, key_two:
或key_ten:
開頭的任何 ip 模式。
預期模式= key_one | key_two| key_ten & (\\d+.\\d+.\\d+.\\d+)
key_one | key_two| key_ten & (\\d+.\\d+.\\d+.\\d+)
但是, or(|) 條件適用於 pcre,但不適用於 and(&) 條件。 有人可以幫我使用 and (&) 條件嗎? 感謝你。
您的正則表達式幾乎是正確的:除非使用/x
修飾符,否則您認為模式中的空格沒有意義(在 PCRE 中,字符類之外),並且值之間有一個冒號。 此外,必須對點進行轉義以匹配文字點。
您可以使用
(key_(?:one|two|ten)):(\d{1,3}(?:\.\d{1,3}){3})
這是一種契約形式
(key_one|key_two|key_ten):(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})
查看正則表達式演示
如果您需要獲取 IP 作為匹配值,請使用\\K
運算符丟棄與該運算符匹配的所有文本並僅返回稍后匹配的內容:
key_(?:one|two|ten):\K\d{1,3}(?:\.\d{1,3}){3}
請參閱此正則表達式演示。
請注意,這是寫在這樣一種方式替代最佳實踐,他們沒有可以匹配在同一位置(以提高性能),這就是為什么它是不是一個好主意,重復同樣的key_
內子(...|...)
。
+
量詞匹配 1 次或多次出現,並且在 IP 地址中只能有一到三位數,這就是限制量詞{1,3}
似乎更可靠的原因。
此外,為了避免不必要的捕獲,只需將捕獲( (...)
) 組轉換為非捕獲組 ( (?:...)
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.