2017-07-13 56 views
1

爲什麼這與捕獲組不匹配?Grep正則表達式捕獲問題

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)

回答

2

它發生如此因爲grep不返回捕獲組內容,只有整個匹配。

您可以使用\K匹配復位操作和和積極的向前看,而不是:

grep -Po 'ServerMethod\(me\.[a-zA-Z]*\.\K[a-zA-Z]+(?=\))' 

online demo

詳細

  • ServerMethod\(me\. - 匹配的文本字符串ServerMethod(me.
  • [a-zA-Z]* - 0個或多個ASCII字母
  • \. - 字面點
  • \K - 忽略從比賽
  • [a-zA-Z]+到目前爲止所匹配的文本 - 1個或多個ASCII字母
  • (?=\)) - 一個正向前查找需要一個)立即在當前位置的右側,但不會將其添加到匹配中(因爲它是非消耗性模式的)。

另外,作爲PCRE grep選項並不總是可用的,使用sedgrep

grep 'ServerMethod(me\.' | sed 's/.*ServerMethod(me\.[a-zA-Z]*\.\([a-zA-Z]*\)).*/\1/' 

another demo

這裏,模式是POSIX BRE兼容:

  • ServerMethod(me\. - 匹配的文字ServerMethod(me.文本,grep獲取與此文字
  • .*ServerMethod(me\.[a-zA-Z]*\.\([a-zA-Z]*\)).*行 - 匹配有
    • .*線 - 儘可能多的任何0+字符
    • ServerMethod(me\. - 字面ServerMethod(me. text
    • [a-zA-Z]* - 0+ ASCII字母
    • \. - 字面點
    • \([a-zA-Z]*\) - 捕獲組1(經由\1簡稱):0+ ASCII字母
    • ) - 字面)
    • .* - 任何0+字符儘可能多
+0

Tha你的答案。你知道你的代碼爲什麼不能在cygwin控制檯上工作嗎? –

+0

如果您在之前的嘗試中成功使用了「-P」選項,它應該可以工作,否則,您將無法使用PCRE模式。 –