我正在试图弄清楚如何匹配“单词”而不是“word1”,“w1ord”或“单词!”的任何变体。哪里“!”可能是任何“#%!”
基本上我想匹配只使用A-Z和a-z的单词。以下不起作用:/
([A-Za-z])\w+
因为“word%5”是匹配。
答案 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));
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 | $)