2013-02-01 92 views
7

任何人都可以爲我提供用於驗證字符串的正則表達式,該字符串只允許除反斜線之外的任何特殊字符。我試圖在C#中允許反斜槓的正則表達式#

var regexItem = new Regex("^[a-zA-Z0-9\\\ ]*$"); 

但它似乎沒有工作

+3

「似乎不起作用」的意思?它做什麼,你不指望? –

回答

8

您也需要加倍逃脫它(一次C#和一次正則表達式引擎):

var regexItem = new Regex("^[a-zA-Z0-9\\\\ ]*$"); 

或者你可以使用C的verbatim string feature#(注意@):

var regexItem = new Regex(@"^[a-zA-Z0-9\\ ]*$"); 

在逐字字符串,反斜槓不interpre開始一個轉義序列,所以你只需要爲Regex引擎轉義一次。

我假設你的當前代碼不能編譯。它應該說「無法識別的轉義序列」。
原因是你有三個反斜槓後面跟着一個空格。前兩個反斜槓被解釋爲表示反斜槓的轉義序列,但第三個反斜槓被解釋爲以空格作爲第二個字符開始轉義序列。這種轉義序列不存在,導致錯誤。

0

你將不得不通過增加 \s用於匹配單個\逃脫\的正則表達式,以及C#字符串。

17

反斜槓需要在正則表達式中轉義 - 而且它們需要在C#中轉義,除非您使用verbatim string literals。因此,無論這些應該工作:

var regexItem = new Regex(@"^[a-zA-Z0-9\\ ]*$"); 
var regexItem = new Regex("^[a-zA-Z0-9\\\\ ]*$"); 

這兩個確保以下字符串內容傳遞給Regex構造:

^[a-zA-Z0-9\\ ]*$ 

Regex代碼就看到雙反斜線並把它當作「我真的想匹配反斜槓字符。」

基本上,您總是需要區分「要傳遞給正則表達式引擎的字符串內容」和「源代碼中的字符串文字表示法」。 (這是真的不只是爲正則表達式,當然,調試器不會在監視窗口等逃避幫助。)

編輯:現在這個問題已被編輯,說明你原本反斜槓,這只是無效的C#。我懷疑你「與三個反斜槓一個字符串」進行瞄準這將是以下任一:

var regexItem = new Regex(@"^[a-zA-Z0-9\\\ ]*$"); 
var regexItem = new Regex("^[a-zA-Z0-9\\\\\\ ]*$"); 

...但你並不需要儘量躲避空間正則表達式關心。

+0

請注意,沒有任何內容傳遞給正則表達式,因爲代碼不能編譯。 –

+1

@DanielHilgarth:編輯之前編譯的問題中顯示*的代碼。(當我回答問題時,問題顯示了兩個反斜槓,不是代碼風格,我知道降價有三個反斜槓,但我回答了我看到的問題:) –

+0

我只是格式化了代碼。請查看原始修訂版本的來源。三條反斜槓從一開始就在那裏。 –

相關問題