2015-04-14 21 views
0

我有一個if聲明,我試圖凝結成一個正則表達式語句。該if聲明如下:RegEx有條件的基礎是哪一個字母

string degree = "21S" 
if (degree != "" && 
    Convert.ToInt32(degree) > 9 && 
    TChr == "N" || 
    degree != "" && 
    Convert.ToInt32(degree) > 41 && TChr == "S") 

字符串將始終是一個數字,要麼一個SN(北/南)。如果它是N,則該數字必須介於1-9之間,如果它是S,範圍是1-41

我一直在嘗試範圍內有條件的:

^(?(/dN)[1-9]N|[1-51]S)$ 

但是,它不是一無所獲,所以我想我會約了錯誤的方式。

+0

if語句看起來很謹慎,「||」或「......」是否可以修復邏輯?這是一個錯字嗎? – OmegaMan

+0

它被複製出工作代碼。 – BattlFrog

回答

2

您可以使用以下正則表達式:

\b(?:[1-9]N|(?:[1-9]|[1-3][0-9]|4[01])S)\b 

var pattern = @"\b(?:[1-9]N|(?:[1-9]|[1-3][0-9]|4[01])S)\b"; 

這裏是demo

enter image description here

2

正則表達式是不是這個職位的最佳工具,因爲它是很難檢查整數與正則表達式的範圍。

除非你真的必須使用正則表達式,否則我只是清理你有一點點。它比正則表達式更具可讀性,可以執行相同的操作。

string input = "21S"; 
char direction = input.Last(); 
int degree = int.Parse(input.Trim('N', 'S')); 
bool valid = ((direction == 'N' && degree >= 1 && degree <= 9) || 
       (direction == 'S' && degree >= 1 && degree <= 41); 
+0

我同意,雖然pjt mgr特別需要正則表達式。 – BattlFrog

1

我認爲你試圖爲這個:

^(?(?=\dN)[1-9]N|(?:4[01]|[1-3][0-9]|[1-9])S)$ 

...但你並不真的需要一個有條件的完成這個任務。這只是正常:

^(?:[1-9]N|(?:4[01]|[1-3][0-9]|[1-9])S)$ 

而且,你無法比擬數字用正則表達式(即,通過他們的數值)。字母,數字,標點符號等,它們都只是字符。