[英]Grep regex capturing issue
為什么這與捕獲組不匹配?
grep -rPo 'ServerMethod\(me\.[a-zA-Z]*\.([a-zA-Z]*)\)'
它返回:
test.js:ServerMethod(me.obProcedures.SaveProcess)
test.js:ServerMethod(me.obProcedures.Commit)
但我只需要:
SaveProcess
Commit
cygwin版本:2.5.2(0.297 / 5/3)
發生這種情況是因為grep
不會返回捕獲組內容,而只會返回整個匹配項。
您可以使用\\K
匹配重置運算符和一個正向前行代替:
grep -Po 'ServerMethod\(me\.[a-zA-Z]*\.\K[a-zA-Z]+(?=\))'
觀看在線演示
詳細資料 :
ServerMethod\\(me\\.
與文字字符串ServerMethod(me.
[a-zA-Z]*
-0個或更多ASCII字母 \\.
-文字點 \\K
省略與匹配項相距太遠的文本 [a-zA-Z]+
-1個或多個ASCII字母 (?=\\))
-正超前,需要一個)
立刻到當前位置的右側,但不將其添加到匹配(因為它是一種非耗模式)。 另外,由於PCRE grep
選項並非總是可用,請與sed
一起使用grep
:
grep 'ServerMethod(me\.' | sed 's/.*ServerMethod(me\.[a-zA-Z]*\.\([a-zA-Z]*\)).*/\1/'
參見另一個演示 。
在這里,這些模式符合POSIX BRE:
ServerMethod(me\\.
匹配文字ServerMethod(me.
文本), grep
獲取帶有此文本的行 .*ServerMethod(me\\.[a-zA-Z]*\\.\\([a-zA-Z]*\\)).*
-匹配具有以下內容的行
.*
-盡可能多的0個字符 ServerMethod(me\\.
ServerMethod(me.
文字ServerMethod(me.
文本 [a-zA-Z]*
-0+ ASCII字母 \\.
-文字點 \\([a-zA-Z]*\\)
-捕獲組1(通過\\1
引用):0+ ASCII字母 )
-文字)
.*
-盡可能多的0個字符
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.