2011-04-17 359 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财产。