簡體   English   中英

C# - Regex匹配整個單詞

[英]C# - Regex Match whole words

我需要匹配包含給定字符串的所有單詞。

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

如何使用正則表達式實現此目的。

編輯:擴展的示例字符串。

如果您正在尋找包括'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

BTW,.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*代替,甚至[AZ]* ,這取決於你對“單詞”的確切含義。 [!\\..]匹配! .

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屬性提供。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM