C# - Regex匹配整个单词

时间:2011-04-17 06:45:15

标签: c# regex regex-negation

我需要匹配包含给定字符串的所有单词。

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

如何使用正则表达式实现此目的。

编辑:扩展样本字符串。

6 个答案:

答案 0 :(得分:3)

如果你正在寻找包括'TEST'在内的所有单词,你应该使用

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

\ w包含单词字符,是[A-Za-z0-9 _]

的缩写

答案 1 :(得分:2)

保持简单:为什么不尝试\w*TEST\w*作为匹配模式。

答案 2 :(得分:2)

我得到了您期望的结果:

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

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

答案 3 :(得分:1)

尝试使用\b。它是非单词分隔符的正则表达式标志。如果你想匹配两个单词,你可以使用:

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

顺便说一句,.net不需要周围的/,而i只是一个不区分大小写的匹配标志。

.NET替代方案:

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

答案 4 :(得分: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"]);
        }

完全按照你想要的方式工作。

顺便说一句,你的正则表达式模式应该是逐字字符串(@“”)

答案 5 :(得分:0)

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

首先,正如@manojlds所说,你应该尽可能使用逐字符串作为正则表达式。否则,你必须在大多数正则表达式转义序列中使用两个反斜杠,而不只是一个(例如[!\\..]*)。

其次,如果你想匹配除点之外的任何东西,那么正则表达式的那部分应该是[^.]*^是反转字符类的元字符,而不是!,而.在该上下文中没有特殊含义,因此不需要对其进行转义。但是你应该使用\w*代替[A-Z]*,甚至[!\..],这取决于你对“单词”的确切含义。 !匹配.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

匹配的文本将通过Match的{{1}}属性提供。