2016-02-24 83 views
5

我想匹配一個數字等於或高於捕獲組中的數字的字符串。可能在數字範圍內使用反向引用?

例子:

  • 1x1 =匹配
  • 1x2 =匹配
  • 2x1 =敵不過

在我的腦海裏正則表達式將是這個樣子(\d)x[\1-9]但這並不工作。使用正則表達式可以實現這個嗎?

+3

什麼是正則表達式? –

+0

我想在谷歌分析中使用它,我不知道它是什麼味道,但我會假設PCPRE – Frinsh

+2

不,GA使用RE2。這意味着用純正則表達式無法做到這一點。 –

回答

2

正如你已經發現,你不能插值內的正則表達式,因爲值:

因爲當正則表達式編譯確定字符類...唯一的字符類的正則表達式節點類型是「硬編碼的字符列表「,這是在編譯正則表達式時創建的(而不是在它部分運行並計算出1美元可能最終產生的結果之後)。

[Source]

由於字符類不允許反向引用,反斜槓後跟數字在字符類改變用途:

反斜線後跟兩個或三個八進制數字是考慮一個八進制數。

[Source]

這顯然不是你的[\1-9]何意。但是由於在知道所有角色之前無法編譯角色類,所以我們必須找到另一種方式。

如果我們希望完全在一個正則表達式中完成,我們不能枚舉所有可能的組合,因爲我們必須檢查所有捕獲來找出哪一個匹配。 For example

"1x2" =~ m/(?:(0)x(\d)|(1)x([1-9])|(2)x([2-9])|(3)x([3-9])|(4)x([4-9])|(5)x([5-9])|(6)x([6-9])|(7)x([7-9])|(8)x([89])|(9)x(9))/ 

將包含「1」 $3$4「2」,但你必須尋找捕獲1至20發現如果有什麼是每次匹配。


各地做對正則表達式的結果後處理的唯一方法是使用正則表達式條件:(?(A)X)A是有條件的,X是所產生的動作。

Sadly conditionals are not supported by RE2,但我們將繼續努力證明它可以完成。

你想使用的X什麼是(*F)(或(?!)在Ruby中2+)強制失敗:http://www.rexegg.com/regex-tricks.html#fail

什麼你想使用的A?{$1 > $2},但only Perl will allow you to use code directly in a regex。Perl的將允許你使用:

m/(\d)x(\d)(?(?{$1 > $2})(?!))/ 

[Live Example]

所以回答你的問題是:「不,你不能做到這一點與谷歌Analytics使用 RE2,但是是你可以做的這與一個Perl正則表達式。「

相關問題