String poolId = "something/something-else/pools[name='test'][scope='lan1']";
String statId = "something/something-else/pools[name='test'][scope='lan1']/stats[base-string='10.10.10.10']";
Pattern pattern = Pattern.compile(". pools\\[name='. '\\]\\[scope='. '\\]$");
應該使用什么正則運算式使得
pattern.matcher(poolId).matches()
回傳true而
pattern.matcher(statsId).matches()
回傳false?
注意
something/something-else無關緊要,可以是任意長度- 雙方
name并scope可以包括任何的任何字符\, /, [, ]等 stats[base-string='10.10.10.10']是一個例子,之后可以有其他任何東西/
我試圖?像這樣使用非貪婪,. pools\\[name='. '\\]\\[scope='. ?'\\]$但仍然兩個匹配項都回傳true
uj5u.com熱心網友回復:
您可以使用
. pools\[name='[^']*'\]\[scope='[^']*'\]$
請參閱正則運算式演示。詳情:
.- 除換行符以外的任何一個或多個字符,盡可能多pools\[name='- 一個pools[name='字串[^']*- 除 a 之外的零個或多個字符''\]\[scope='- 一個'][scope='字串[^']*- 除 a 之外的零個或多個字符''\]- 一個']子串$- 字串的結尾。
在 Java 中:
Pattern pattern = Pattern.compile(". pools\\[name='[^']*']\\[scope='[^']*']$");
請參閱Java 演示:
//String s = "something/something-else/pools[name='test'][scope='lan1']"; // => Matched!
String s = "something/something-else/pools[name='test'][scope='lan1']/stats[base-string='10.10.10.10']";
Pattern pattern = Pattern.compile(". pools\\[name='[^']*']\\[scope='[^']*']$");
Matcher matcher = pattern.matcher(s);
if (matcher.find()){
System.out.println("Matched!");
} else {
System.out.println("Not Matched!");
}
// => Not Matched!
uj5u.com熱心網友回復:
Wiktor 假設您的name和值scope中不能包含單引號。因此如下:
.../pools[name='tes't']
不匹配。這確實是唯一有效的假設,就好像您可以包含未轉義的單引號一樣,那么如何阻止值scope成為(例如)字面值lan1']/stats[base-string='10.10.10.10?您在問題中包含的正則運算式存在此問題。如果您只是必須在代碼中包含這些值,則需要以某種方式對它們進行轉義。嘗試以下操作(編輯 Wiktor 的正則運算式):
. pools\[name='([^']|\\')*'\]\[scope='([^']|\\')*'\]$
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/355944.html
上一篇:如何在python中使用正則運算式捕獲帶有千位和小數分隔符的價格
下一篇:捕獲不在單引號之間的分隔符
