2011-04-17 171 views
5

我需要匹配包含給定字符串的所有單詞。C# - 正則表達式全字匹配

string s = "ABC.MYTESTING 
XYZ.YOUTESTED 
ANY.TESTING"; 

Regex r = new Regex("(?<TM>[!\..]*TEST.*)", ...); 
MatchCollection mc = r.Matches(s); 

我需要的結果是:

MYTESTING 
YOUTESTED 
TESTING 

,但我得到:

TESTING 
TESTED 
.TESTING 

如何使用正則表達式實現這一目標。

編輯:擴展的樣本串。

回答

3

如果你正在尋找所有的單詞,包括「TEST」,你應該使用

@"(?<TM>\w*TEST\w*)" 

\ W包括字字符,是短期的[A-ZA-Z0-9 _]

+0

其實我正在尋找與任何地方的測試匹配.. – tvr 2011-04-17 07:00:31

+0

我更新了我的建議。 – 2011-04-17 07:08:47

+0

謝謝,但\ w – tvr 2011-04-17 07:18:26

1

嘗試使用\b。這是非單詞分隔符的正則表達式標誌。如果你想同時匹配的話,你可以使用:

/\b[a-z]+\b/i 

BTW,.NET不需要周圍/,而i僅僅是不區分大小寫的匹配標誌。

.NET備選:

var re = new Regex(@"\b[a-z]+\b", RegexOptions.IgnoreCase); 
+0

此相匹配的1個字母的單詞,而不是兩個單詞。 – mousio 2011-04-17 06:54:59

+0

嗯。我如何指定?我試過,但不起作用: 正則表達式R =新的正則表達式( 「\ B( * TEST *)\ B'[\ ..!]。」,...); – tvr 2011-04-17 06:58:48

+0

@mousino:確實我錯過了一個量詞,但會匹配這兩個詞。 – 2011-04-17 07:00:03

0

使用組我想你可以實現它。

 string s = @"ABC.TESTING 
     XYZ.TESTED"; 
     Regex r = new Regex(@"(?<TM>[!\..]*(?<test>TEST.*))", RegexOptions.Multiline); 
     var mc= r.Matches(s); 
     foreach (Match match in mc) 
     { 
      Console.WriteLine(match.Groups["test"]); 
     } 

完全像你想要的。

順便說一句,你的正則表達式模式應該是一個逐字字符串(@「」)

+0

這不工作.. – tvr 2011-04-17 07:00:09

+0

我已經編輯我的反應。 – manojlds 2011-04-17 07:20:57

+0

在這裏不需要了'Multiline'選項,但'IgnoreCase'可能。關於'[!\ ..] *',請參閱我的答案。 – 2011-04-17 07:44:01

2

保持簡單:爲什麼不乾脆試試\w*TEST\w*作爲匹配模式。

2

我讓你用下面的預期結果:

string s = @"ABC.MYTESTING 
XYZ.YOUTESTED 
ANY.TESTING"; 

var m = Regex.Matches(s, @"(\w*TEST\w*)", RegexOptions.IgnoreCase); 
+0

對於逐字字符串和(可能)正確的正則表達式+1,但'RegexOptions.Multiline'在這裏沒有任何用處。 – 2011-04-17 07:45:49

+0

@alan正確的你,現在被刪除。這從我的LINQPad腳本偷偷進來。 – arcain 2011-04-17 08:17:08

+0

是的,RegexBuddy也總是潛入其中。很煩人。 – 2011-04-17 08:23:06

0
Regex r = new Regex(@"(?<TM>[^.]*TEST.*)", RegexOptions.IgnoreCase); 

首先,@manojlds說,你應該爲正則表達式儘可能使用逐字字符串。否則,你必須在大多數正則表達式轉義序列中使用兩個反斜槓,而不僅僅是一個(例如[!\\..]*)。

第二,如果你想匹配任何東西,但一個點,正則表達式的那部分應該是[^.]*^是反轉字符類,不!元字符,並.在這方面沒有特殊的意義,所以它並不需要進行轉義。但是,您應該使用\w*來代替,或者甚至使用[A-Z]*,具體取決於「word」的含義。 [!\..]匹配!.

Regex r = new Regex(@"(?<TM>[A-Z]*TEST[A-Z]*)", RegexOptions.IgnoreCase); 

這樣,你不需要用字邊界打擾,雖然他們不傷害:

Regex r = new Regex(@"(?<TM>\b[A-Z]*TEST[A-Z]*\b)", RegexOptions.IgnoreCase); 

最後,如果你總是把整場比賽,無論如何,你不」噸需要使用捕獲組:

Regex r = new Regex(@"\b[A-Z]*TEST[A-Z]*\b", RegexOptions.IgnoreCase); 

匹配的文本將可通過匹配的Value財產。