我想采用類似 xpath 的字串,例如:
a.b.c[2].d[123].e1[4].f88[5]
并將每個路徑部分作為匹配項,將每個下標(“陣列索引”)作為一個組,如下所示:
match 1: a
match 2: b
match 3: c, group 1: 123
match 4: e1, group 1: 4,
match 5: f88, group 1: 5
我嘗試了以下操作(不起作用):
[^.] (?:\[)*([0-9] )*(?:\])*
據我了解這個正則運算式,這意味著:
- 首先,匹配除點以外的所有字符
- 然后,檢查(但不捕獲)左方括號 - 它可能出現 0 到無限次。
- 然后,檢查任何數字,長度為 1 到無限制 - 并作為一個組捕獲。
- 然后,再次為右方括號做 2。
但它不起作用。
我怎樣才能讓它作業?
uj5u.com熱心網友回復:
[^.] (?:\[)*([0-9] )*(?:\])*
“但它不起作用”,因為它 很貪婪并且消耗了點之前的所有字符。此外,每個下標都是整體可選的,而不是一部分。
應用這些標準,這個運算式確實有效:
([^.\[] )(?:\[(\d )\])?
Regex101 測驗
uj5u.com熱心網友回復:
您嘗試的模式:
您嘗試的模式匹配太多,因為否定字符類
[^.]匹配除點以外的任何字符 1 次或多次,并且還可以匹配方括號。請注意,此符號與左方括號
(?:\[)*相同\[*并匹配 0 次或更多次
如果支持\G錨點,并且您只想從字串的開頭匹配示例字串,您可以為所需資料使用 2 個捕獲組,并匹配其間的點和方括號。
\G([^\][.\s] )(?:\[(\d )\])?\.?
模式匹配:
\G斷言在前一個匹配的末尾或字串的開頭的位置([^\][.\s] )捕獲組 1,匹配 1 字符而不是][.空白字符(因為示例字串中似乎沒有任何空格)(?:\[(\d )\])?可選地在匹配的方括號之間匹配捕獲組 2\.?匹配一個可選的點來繼續對\G錨點的連續匹配
正則運算式演示
如果字串末尾不能有一個點,并且必須至少有 1 個點存在,您可以首先從字串的開頭斷言整個格式:
(?:^(?=[^.] (?:\.[^.] ) $)|\G(?!^))\.?([^\][.] )(?:\[(\d )\])?
正則運算式演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/334553.html
