簡體   English   中英

Grep正則表達式捕獲問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM