正则表达式 - >只有字母,以点结尾

时间:2012-02-10 21:44:03

标签: c# regex

我正在尝试选择所有仅包含字母或仅包含字母且以点结尾的标记。

有效单词示例:"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点结束?不确定这个

2 个答案:

答案 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]+\.?$

否则,.是一个特殊字符,匹配(几乎)所有字符 - 而不仅仅是句点。