正则表达式只匹配没有特殊符号或数字的单词

时间:2016-11-15 08:54:15

标签: c# regex

我正在试图弄清楚如何匹配“单词”而不是“word1”,“w1ord”或“单词!”的任何变体。哪里“!”可能是任何“#%!”

基本上我想匹配只使用A-Z和a-z的单词。以下不起作用:/

([A-Za-z])\w+

因为“word%5”是匹配。

3 个答案:

答案 0 :(得分:1)

你可以用linq来做。查看ASCII Table以查看字母从A到Z的字母值。您可以在此之后将您的字符串置高,仅检查范围65到90。

bool notOnlyLetters = yourStringValue.ToUpper().Any(x => !(x >= 65 && x <= 90));

答案 1 :(得分:1)

要匹配由英文字母组成的整个字符串,请使用LINQ或regex:

var hasAllEnglishLetters = x.All(c => (c >= 65 && c <= 90) || c >=97 && c<= 122));
var hasAllEnglishLetters = Regex.IsMatch(x, @"^[a-zA-Z]+$");

要匹配较大字符串中的单词,您也可以使用正则表达式或LINQ方法:

var s = "Match word but not word1, w1ord or word!";
var res_linq = s.Split().Where(x => x.All(c => (c >= 65 && c <= 90) || c >=97 && c<= 122));
Console.WriteLine(string.Join(";", res_linq));
// REGEX
var res_regex = Regex.Matches(s, @"(?<!\S)[a-zA-Z]+(?!\S)").Cast<Match>().Select(m=>m.Value);
Console.WriteLine(string.Join(";", res_regex));

请参阅online C# demo

LINQ方法详细信息:使用Split(),字符串被拆分为非空白符号块,.All(c => (c >= 65 && c <= 90) || c >=97 && c<= 122)确保只提取属于ASCII字母的那些块(65到90 - 大写ASCII字母,97到122是小写字母)。

正则表达式方法:如果在(?<!\S)(或字符串的开头)之前没有空格,1个或多个ASCII字母,则为[a-zA-Z]+ lookbehind会使匹配失败如果字母后面没有空格(或字符串结尾),则前瞻(?!\S)会使匹配失败。

答案 2 :(得分:1)

以下正则表达式接受每个&#34;字&#34;发生在:

之间
  • 行的开头或空格(^|\s)

  • 空格或行尾。 (\s|$)
  

(^ | \ S)字(\ S | $)

如果您只想查找由字母字符组成的每个单词,可以按如下方式更改正则表达式:

  

(^ | \ S)[A-ZA-Z] +(\ S | $)