2010-03-29 53 views
2

我需要能夠檢查與|在他們中。例如,像d*|*t這樣的表達式應該爲「dtest | test」之類的字符串返回true。正則表達式加上「|」

我不是正則表達式的英雄,所以我只是嘗試了幾件事情,如:

Regex Pattern = new Regex("s*\|*d"); //unable to build because of single backslash 
Regex Pattern = new Regex("s*|*d"); //argument exception error 
Regex Pattern = new Regex(@"s*\|*d"); //returns true when I use "dtest" as input, so incorrect 
Regex Pattern = new Regex(@"s*|*d"); //argument exception error 
Regex Pattern = new Regex("s*\\|*d"); //returns true when I use "dtest" as input, so incorrect 
Regex Pattern = new Regex("s*" + "\\|" + "*d"); //returns true when I use "dtest" as input, so incorrect 
Regex Pattern = new Regex(@"s*\\|*d"); //argument exception error 

我有點跳出選項,我應該再使用? 我的意思是我知道這是一個非常基本的正則表達式,但由於某種原因我沒有得到它。

回答

5

在正則表達式中,*表示「零或更多(之前的模式)」,例如, a*意味着零個或多個a,(xy)*預計匹配形式xyxyxyxy...

要匹配的任何字符,則應該使用.*,即

Regex Pattern = new Regex(@"s.*\|.*d"); 

(另外,|手段 「或」)

這裏.將匹配任何字符[1],包括|。爲了避免這種情況,你需要使用一個字符類

new Regex(@"s[^|]*\|[^d]*d"); 

這裏[^x]意味着「任何字符,除了x」。

您可以閱讀http://www.regular-expressions.info/tutorial.html以瞭解有關RegEx的更多信息。

[1]:除了新行\n。但如果您傳遞單行選項,則.將匹配\n。嗯,這是更高級的東西...

+0

使用非貪婪通配符而不是負面字符類(例如'。*?d'而不是'[^ d] * d')可能會更容易理解。 – eyelidlessness 2010-05-18 06:11:35

+0

@eye:非貪婪匹配會導致回溯緩慢,並且RegEx的某些風格(例如ERE)不支持非貪婪模式。 – kennytm 2010-05-18 06:53:16

+0

我發現第一點與直覺相反,因爲這兩種模式在實踐中應該是相同的,但我查了一下,看起來你是對的(對於大多數引擎,有些優化);第二點看起來並不相關,因爲提問者正在使用哪個引擎(雖然我可以理解爲未來的搜索者提供更通用的答案)。 – eyelidlessness 2010-05-18 08:09:47

0

s.*\|.*d怎麼樣?
你嘗試的問題是,你寫了類似​​的東西 - 這意味着:匹配任何數量的s(包括0)。您需要使用.(如我的示例中)來定義跟在s後面的字符。您只能使用\w作爲字母數字字符。

1

一個|一個char class內將字面上處理,所以你可以嘗試的正則表達式:

[|] 
0

試試這個。

string test1 = "dtest|test"; 
string test2 = "apple|orange"; 
string pattern = @"d.*?\|.*?t"; 

Console.WriteLine(Regex.IsMatch(test1, pattern)); 
Console.WriteLine(Regex.IsMatch(test2, pattern)); 
0

Regex Pattern = new Regex(@"s*\|*d");會起作用,除非| *表示「0或更多管道」。所以,你可能想Regex Pattern = new Regex(@"s.*\|.*d");

0

在Javascript中,如果您構建
var regex = /somestuff\otherstuff/;
然後反斜線是如你所期望。但是,如果你建立同樣的事情用不同的語法
var regex = new Regex("somestuff\\otherstuff");
則因爲在Javascript解析的方式古怪的你必須雙所有反斜線。我懷疑你的第一次嘗試是正確的,但是你在解決舊問題時導入了一個新問題,因爲你遇到了單反斜槓的另一個問題。