簡體   English   中英

.NET正則表達式-如何獲得匹配計數?

[英].NET Regular Expression - How to get a match count?

我有一個突出顯示文本的程序。 突出顯示的術語由我們的用戶定義。 他們可以使用'*'字符在術語的開頭或結尾指定通配符。 最后,用戶正在尋找我們還為他們提供每個學期的點擊數。

為了簡單起見,讓我們假設我只給出了兩個詞:正義和正義*。 該程序將運行一些如下所示的正則表達式:

{(?:nocapture^|[^\p{L}\p{N}']|\b)((justice)|(just[\S]*))(?:nocapture$|[^\p{L}\p{N}']|\b)}

並假設該用戶要突出顯示並獲得計數的文本塊是這樣的:

This is justice!

雖然它可以正確找到單詞“ justice”,但是在捕獲組中只有“ justice”受到了打擊。 它與帶有“ just [\\ S] *”的捕獲組不匹配。

因此,有沒有辦法編寫正則表達式(或使用.NET選項)來強制引擎嘗試對由OR分隔的每個捕獲組運行匹配? 還是僅在最左邊的捕獲組被OR分開時才使用它們?

謝謝!

如果兩者匹配,它始終是出現順序中的第一個。 當然,如果匹配的一個圖案匹配導致在后續位置失敗,發動機將回溯並嘗試捕獲組中相匹配的其它圖案。

如果您考慮一下,當引擎看到具有多個匹配模式的捕獲組時,它必須某種方式選擇其中一個作為“臨時正確結果”,然后再嘗試匹配表達式的其余部分。 以某種方式是“最左邊是優選的”。

如果不必使用OR來檢查組中的每個選項,則對於regex引擎而言,速度更快。 一旦組中的選項之一為真(從左至右讀取),則整個組為真。

這就像您有一個條件語句一樣:

int num = 2;

// has to check both values
if(num == 1 || num == 2) { /* stuff */ }

// only has to check the first one, can skip over the second compare for speed
if(num == 2 || num == 3) { /* stuff */ }

// has to check both values
if(num == 3 || num == 4) { /* stuff */ }

因此,據我所知,回答您的問題是不可能的。 但是為什么要強制執行呢?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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