[英]If string contains one from the list with regex check
我想检查我的列表中的 OU 是否包含在此字符串中,并且我希望它检查 OU= 是否有两个符号。 例如,在我的列表中,我有 EE 国家/地区代码,但在此示例字符串中,我有 OU=EER,但它不是国家/地区代码。 在我的列表中,我没有 OU=NL。 我知道我需要检查我找到的字符串是否有两个字符,但我不知道如何。
细绳:
CN=nlpgebl,OU=用户,OU=C3176172,OU=EER,OU=NL
代码:
var countries = new List<string> { "AT", "HR", "BG", "CZ", "EE", "GR", "HU", "LT", "LV", "MK", "PL", "RO", "RS", "SI", "SK", "TR" };
if (countries.Any(nodes[5].InnerText.Contains)) // Regex that i think need here: OU=[a-zA-Z]+
您的输入字符串是逗号分隔的键=值对。 使用它对您有利,并且不需要正则表达式。
用逗号分割,用等号分割每个元素,并用正确的前缀过滤列表。 然后你可以得到你感兴趣的两个答案。
var input = "CN=nlpgebl,OU=Users,OU=C3176172,OU=EER,OU=NL";
IEnumerable<string> ouValues = input
.Split(',')
.Select(x => x.Split('=', 2)) // "2" just in case the value has an equals in it
.Where(x => x[0] == "OU")
.Select(x => x[1]);
var targetCountries = new List<string> { "AT", "HR", "BG", "CZ", "EE", "GR", "HU", "LT", "LV", "MK", "PL", "RO", "RS", "SI", "SK", "TR" };
问题一是“是否有任何ouValues
条目等于targetCountries
中的值?”
var inputContainsCountry = ouValues.Intersect(targetCountries).Any();
如果稍后您想知道输入字符串中的目标国家/地区,则需要去掉Any
以查看匹配值列表,然后相应地处理集合长度。
问题二是“是否有任何ouValues
值正好是两个大写字母?”
var containsCountryCode = ouValues.Any(val => val.Length == 2 && char.IsLetter(val[0]) && char.IsLetter(val[1]));
// or
var containsCountryCode = ouValues.Any(val => Regex.IsMatch(val, @"^[A-Z]{2}$"));
这里的正则表达式只是检查两个大写字母,而^
和$
只是确保它是字符串中的唯一内容。
打印你得到的值
Console.WriteLine("Contains a target country: " + inputContainsCountry);
Console.WriteLine("Contains any country code: " + containsCountryCode);
Contains a target country: False
Contains any country code: True
尝试以下操作:
string input = "CN=nlpgebl,OU=Users,OU=C3176172,OU=EER,OU=NL";
string pattern = "OU=(?'value'[A-Za-z0-9]+)";
MatchCollection matches = Regex.Matches(input, pattern);
int count = matches.Count;
foreach (Match match in matches)
{
string value = match.Groups["value"].Value;
Console.WriteLine("Value = {0}, count = {1}",value, value.Length);
}
Console.ReadLine();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.