C# - 正则表达式 匹配整个单词

本文关键字:单词 正则表达式 | 更新日期: 2023-09-27 17:50:18

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

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

如何使用正则表达式实现这一点。

编辑:扩展示例字符串。

C# - 正则表达式 匹配整个单词

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

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

''w 包含单词字符,是 [A-Za-z0-9_] 的缩写

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

我得到了您期望的结果:

string s = @"ABC.MYTESTING
XYZ.YOUTESTED
ANY.TESTING";
var m = Regex.Matches(s, @"('w*TEST'w*)", RegexOptions.IgnoreCase);

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

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

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

.NET 替代方案:

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

使用组我认为你可以实现它。

        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"]);
        }

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

顺便说一句,您的正则表达式模式应该是逐字字符串 (@"(

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);

匹配的文本将通过 Match 的 Value 属性提供。