2015-10-07 44 views
3

我確認下在C#中使用正則表達式的字符串:性能和正則表達式的可讀性,使用提前正面看

[/ 1/2 /]
[/ 1/2 /] [/ 3/4/5 /]
[/ 1 /333分之22/]; [/ 1 /]; [/ 9999 /]

基本上它是一個或多個基團由分號分隔的方括號(但不在最後)。每個組由一個或多個數字組成,並用斜線分隔。沒有其他字符允許。

這是兩個備選方案:

^(\[\/(\d+\/)+\](;(?=\[)|$))+$ 

^(\[\/(\d+\/)+\];)*(\[\/(\d+\/)+\])$ 

第一個版本使用了積極的向前看,第二個版本複製模式的一部分。

這兩個RegEx-es似乎都沒問題,做他們應該做的事,不太好看。 ;)

有沒有人有更好,更快,更容易閱讀解決方案的想法?當我在regex101玩耍時,我意識到第二個版本使用更多的步驟,爲什麼?

與此同時,我意識到計算C#-RegEx中使用的步驟會很好。有什麼辦法可以做到這一點?

+1

RegEx如何易於閱讀? :) –

+0

這是一個易讀的正則表達式:'\ d +'。 –

回答

2

可以使用1個正則表達式來驗證所有這些字符串:

^\[/(\d+/)+\](?:;\[/(\d+/)+\])*$ 

regex demo

爲了便於閱讀,使用詳細標誌(內聯(?x)RegexOptions.IgnorePatternWhitespace):

var rx = @"(?x)^    # Start of string 
      \[/    # Literal `[/` 
      (\d+/)+   # 1 or more sequences of 1 or more digits followed by `/` 
      \]    # Closing `]` 
      (?:    # A non-capturing group start 
      ;    # a semi-colon delimiter 
       \[/(\d+/)+\] # Same as the first part of the regex 
      )*    # 0 or more occurrences 
      $    # End of string 
"; 

要測試.NET正則表達式(而不是步數),可以使用regexhero.net服務。使用上面的3個樣本字符串,我的正則表達式顯示每秒217K的迭代速度,這比任何一個正則表達式都要多。

+0

我測試了我的機器上的正則表達式以及您的帖子匹配中的所有3個字符串。沒有辦法過分簡化你的正則表達式,因爲否則驗證將無法正確工作(正如你已經看到過Dan的正則表達式)。 –

+0

如果您不需要捕獲組,您可以通過啓用明確捕獲來加速正則表達式:'(?n)^ \ [/(\ d + /)+ \](; \ [/(\ d + /)+ \])* $''' –

+0

如果捕獲的組未被使用,我只需刪除捕獲組,並只保留用於分組的非捕捉者。這裏不需要顯式捕捉功能。 –

1

您建議的兩個選項沒有什麼特別的錯誤。它們並不像正則表達式那樣複雜,只要您在代碼中添加適當的註釋,它們應該足夠容易理解。

一般來說,我認爲最好避免環視,除非它們是必要的或者極大地簡化了正則表達式 - 它們使得它很難弄清楚發生了什麼,因爲它們添加了一個非線性元素邏輯。

除非您正在執行大量操作或發現代碼的性能問題,否則這種簡單的正則表達式的相對性能不值得擔心。不過,瞭解不同模式的相對錶現可能是有益的。

+0

感謝您的答覆和所有解釋。但我擔心它在所有情況下都不起作用。這一個也應該工作:'; [/ 1/2 /]' – PzYon

+0

@PzYon,哎呀,好抓。在這種情況下,我沒有任何簡單的建議! – 2015-10-07 07:48:52