【问题标题】:How to structure REGEX in C#如何在 C# 中构造正则表达式
【发布时间】:2017-11-07 14:34:05
【问题描述】:

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

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

它今天按预期工作,直到其中一个州被拼写为“佛罗里达......”我希望它能够了解有一个句号字符的事实。

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

如何将它与我当前的正则表达式结合起来,还是不可能?

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

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

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

【问题讨论】:

  • 如果列表中有名称,为什么还要使用正则表达式?
  • 如果文本中有Florida..,您的\b(?:Florida|Washigton|...)\b 仍然会匹配它。
  • 这个Florida.. 字符串是否开始出现在pattern 或使用r 正则表达式检查的输入字符串中?
  • @DmitryEgorov Florida.. 出现在输入字符串中。 pattern 中的字符串永远不会改变。抱歉没有更清楚

标签: c# regex letters


【解决方案1】:

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

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

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

【讨论】:

  • 这并不能解决Florida..里面的模式值
  • @bradbury9:为什么你认为Florida.. 开始出现在pattern 而不是输入字符串中?
  • 因为问题是这么说的one of the states was spelled like "Florida.."
  • OP 声明“检查美国各州是否拼写正确的正则表达式”。这反而表明是输入字符串发生了变化。
  • 请输入失败的字符串?
【解决方案2】:

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

【讨论】:

  • 顺便说一句,您也可以清理您的“模式”变量并使用Florida 而不是Florida..
【解决方案3】:

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

我宁愿选择“更简单”的东西,例如

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

【讨论】:

    【解决方案4】:

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

    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...等。

    【讨论】:

      【解决方案5】:

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

      Colorado|Florida..|New Mexico

      返回 Colorado FloridaNew Mexico 的 3 个匹配项

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多