我正在尝试选择所有仅包含字母或仅包含字母且以点结尾的标记。
有效单词示例:"abc", "abc."
无效"a.b" "a2"
我试过这个
string[] tokens = text.Split(' ');
var words = from token in tokens
where Regex.IsMatch(token,"^[a-zA-Z]+.?$")
select token;
^[a-zA-Z]+
- 只发信一次或多次,以字母
.?$
=以0或1点结束?不确定这个
答案 0 :(得分:5)
在正则表达式中,未转义的.
模式匹配任何字符(包括数字)。因此,您的正则表达式会不合时宜地匹配令牌,例如"a2"
。
您需要将点字符转义为\.
。
string[] tokens = text.Split(' ');
var words = from token in tokens
where Regex.IsMatch(token,@"^[a-zA-Z]+\.?$")
select token;
修改:此外,您可以使用lookbehind和lookahead将Split(' ')
逻辑合并到正则表达式中。这可能会提高效率,尽管它确实会降低可读性。
var words = Regex.Matches(text, @"(?<=\ |^)[a-zA-Z]+\.?(?=\ |$)")
.OfType<Match>()
.Select(m => m.Value);
(?<=\ |^)
lookbehind意味着匹配必须以空格或字符串开头开头。 (?=\ |$)
前瞻意味着匹配必须以空格或字符串结尾继续。答案 1 :(得分:1)
您需要转义.
^[a-zA-Z]+\.?$
否则,.
是一个特殊字符,匹配(几乎)所有字符 - 而不仅仅是句点。