[英]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.