我需要匹配包含给定字符串的所有单词。
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
如何使用正则表达式实现此目的。
编辑:扩展样本字符串。
答案 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}}属性提供。