如何在 C# 中构造 REGEX

How to structure REGEX in C#

我目前有一个正则表达式来检查美国州的拼写是否正确
var r = new Regex(string.Format(@"\b(?:{0})\b", pattern), RegexOptions.IgnoreCase)

pattern 是包含美国所有州的竖线分隔字符串。

它今天按预期工作,直到其中一个州被拼写为 "Florida.." 我希望它能识别出句号这一事实。

我发现这个正则表达式只能匹配字母。 ^[a-zA-Z]+

如何将它与我当前的正则表达式结合起来,或者这不可能吗?

我尝试了一些变体,但没有用

var r = new Regex(string.Format(@"\b^[a-zA-Z]+(?:{0})\b", pattern), RegexOptions.IgnoreCase);

编辑:Florida.. 在我的输入字符串中。我的模式字符串根本没有改变。抱歉没说清楚。

您似乎需要字符串开头 (^) 和字符串结尾 ($) 锚点:

var r = new Regex(string.Format(@"^(?:{0})$", pattern), RegexOptions.IgnoreCase);

上面的正则表达式将匹配任何仅包含州名称的字符串。

您应该替换 pattern 变量以转义正则表达式特殊字符。其中之一是 . 字符。与 pattern.Replace(".", @"\.") 类似,但包含所有特殊字符。

我相信您不能将两种模式合并为一个,因此您必须执行两种不同的正则表达式操作,一种是将状态拆分为一个列表,另一种是用于验证其中的每个项目。

我宁愿去"simpler",比如

var states = input.Split('|').Select(s => new string(s.Where(char.IsLetter).ToArray()))
                 .Where(s => !string.IsNullOrWhiteSpace(s));

基本上不要在这里使用正则表达式。

List<string> values = new List<string>() {"florida", etc.};
string input;
//is input in values, ignore case and look for any value that includes the input value
bool correct = values.Any(a => 
                  input.IndexOf(a, StringComparison.CurrentCultureIgnoreCase) >= 0);

这将比基于正则表达式的选项更有效。这应该匹配 floridaFloridaFlorida...

不要直接搜索字符,告诉正则表达式使用所有未针对特定字符的所有字符,例如[^\|.]+。它使用集合 [ ] 和 not ^ 指示符表示消耗任何不是文字 |. 的东西。因此它只消耗所需的文本。比如on

Colorado|Florida..|New Mexico

returns Colorado FloridaNew Mexico

3 场比赛