Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 两个连续单词或单个单词的复杂正则表达式。C_.net_Regex_C# 4.0 - Fatal编程技术网

.net 两个连续单词或单个单词的复杂正则表达式。C

.net 两个连续单词或单个单词的复杂正则表达式。C,.net,regex,c#-4.0,.net,Regex,C# 4.0,我的数据库中有一个世界上每个城市的列表,还有一个用C编写的应用程序,它需要搜索传入字符串,以确定该字符串中是否存在我的任何城市。然而,我有一些问题要解决的模式,因为一些城市是两个词,如旧金山。感谢您的帮助。最简单的方法可能是在内存中创建一个包含所有城市的数组,从城市中选择名称,然后使用正则表达式或简单字符串方法查看文本中是否找到这些城市 List<string> cities = GetCitiesFromDatabase(); // need to implement this

我的数据库中有一个世界上每个城市的列表,还有一个用C编写的应用程序,它需要搜索传入字符串,以确定该字符串中是否存在我的任何城市。然而,我有一些问题要解决的模式,因为一些城市是两个词,如旧金山。感谢您的帮助。

最简单的方法可能是在内存中创建一个包含所有城市的数组,从城市中选择名称,然后使用正则表达式或简单字符串方法查看文本中是否找到这些城市

 List<string> cities = GetCitiesFromDatabase(); // need to implement this yourself
 string text = @"the text containign city names such as Amsterdam and San Francisco";

 bool containsACity = cities.Any(city => text.Contains(city)); //To search case insensitive, add StringComparison.CurrentCultureIgnoreCase
 IEnumerable<string> containedCities = cities.Where(city => text.Contains(city));
要确保“Amsterdam”与“Amsterdamned”不匹配,可以使用正则表达式而不是Contains:

 bool containsACity = cities.Any(city => Regex.IsMatch(text, @"\b"+Regex.Escape(city))+@"\b")
 // Add RegexOptions.IgnoreCase for case insensitive matches.
 IEnumerable<string> containedCities = cities.Where(city => Regex.IsMatch(text, @"\b"+Regex.Escape(city))+@"\b");
或者,您可以构建一个大型正则表达式来搜索任何城市并执行一次:

 string regex = @"\b(?:" + String.Join("|", cities.Select(city => Regex.Escape(city)).ToArray()) + @")\b"
 bool containsACity = Regex.IsMatch(text, regex, RegexOptions.IgnoreCase);
 IEnumerable<string> containedCities = Regex.Matches(text, regex, RegexOptions.IgnoreCase).Cast<Match>().Select(m => m.Value);
您可以通过缓存城市列表或缓存正则表达式来提高这些调用的性能,并通过创建


另一种解决方案是在数据库中进行计算,而不是将本地城市列表存储在内存中,将输入发送到数据库,并在数据库中使用LIKE语句或正则表达式将城市列表与文本进行比较。根据城市的数量和文本的大小,这可能是一个更快的解决方案,但这是否可行取决于所使用的数据库。

没有三个单词的城市吗?!这和C有什么关系?再举一个例子…我的城市是什么?还有一些单词是城市名称。无论如何,我认为正则表达式不是解决您问题的正确工具。正如马克所说:。您可能需要允许使用三个或更多单词。