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
如何使用正则表达式实现这一点。
编辑:扩展示例字符串。
如果你正在寻找包括"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
属性提供。