2017-03-31 132 views
1

我想匹配並使用記事本++在我的文件中獲取最後一次出現的模式。從多個匹配中獲取最後匹配

我的文字:

X12 

Source =asdjkasjd 
file="x/y1.dun" 
     "x/y2.dun" 
     "x/y3.dun" 

asds12 

    X22 
     p/q/xy.dun 
asda=23 

source =asdf 

    X44 
1000 
1001 
     file="abc.dun" 

我希望使用查找和替換是這樣的:

X12  x/y3.dun 
X22  p/q/xy.dun 
X44  abc.dun 

我迄今爲止嘗試:

(X\d{2}).*?([^"\s]+dun)((?!X\d{2}).)* 

替換爲:

$1\t\t$2\n 

但它返回我:

X12  x/y1.dun //Which is the first match 
X22  p/q/xy.dun 
X44  abc.dun 

如何獲得比賽裏面的最後一場比賽?我正在尋找獲得最後一場比賽的一般方法。

+0

你的問題是不是在你正在嘗試做的都清楚。如果您想要替換文件中最後一個東西的實例,則可以將光標移動到文件底部,然後在查找或替換窗口中將「方向」設置爲「向上」。 – AdrianHHH

+0

@GurV它看起來相當複雜。你還在努力嗎? –

+0

我無法提供單步解決方案。您可以使用['(?s)。*?\ b(X \ d {2})(?:(?!X \ d {2})。)* [「\ s]([^」\ s] + \。dun)+'](https://regex101.com/r/8YnjL6/1)替換爲「$ 1 \ t \ t $ 2 \ n」,然後刪除「尾部」(最後一次匹配後仍然存在) )。 –

回答

1

您可以匹配和捕捉你需要保持,只是配合你不需要的東西,只有用文字替換一下時,捕獲組匹配:

查找內容(?s)\b(X\d{2})(?:(?!X\d{2}).)*["\s]([^"\s]+\.dun)|(?:(?!X\d{2}).)*
替換爲(?{1}$1\t\t$2\n)

查看regex pattern demo

詳細

  • (?s) - 一個DOTALL修飾符(你可以將其刪除,並檢查.匹配換行符選項)
  • \b - 領先字邊界處開始匹配X一個字
  • (X\d{2}) - 組1捕獲X(注意匹配案例必須打開,如果你不想匹配小寫x)和任意兩位數字
  • (?:(?!X\d{2}).)* - 回火貪婪令牌匹配任何字符,零次或多次重複,後面沒有與X和任意兩位數字。由於它是貪婪的,它將使它到達下一個字符開始禁止序列的位置,並且將回溯到隨後的子模式所需的最後一個「頓」。
  • ["\s] - 一個空格或一個雙引號
  • ([^"\s]+\.dun) - 第2組捕獲一個或多於空白和雙引號,然後點其它更多字符和dun
  • | - 或
  • (?:(?!X\d{2}).)* - 相同像上面那樣鍛鍊了貪婪的象徵。

代用細節

  • (?{1} - 如果第1組匹配....
    • $1\t\t$2\n - 與所述第一組值,兩個突片,所述第二組值和替換換行
  • ) - else替換爲空字符串。

enter image description here

+1

完美的解決方案和解釋。謝謝。 :-) – GurV