【问题标题】:How to get a match an entire string instead of just parts?如何匹配整个字符串而不仅仅是部分?
【发布时间】:2014-09-30 20:54:14
【问题描述】:

我有一个正则表达式列表,我遍历这些正则表达式以查找字符串的匹配模式。

我想获取与“00000.00”完全匹配的正则表达式的索引,即 1。但是,0 的正则表达式也返回 true,但只有当存在长度为 5 的数字或字符串时才应返回 true 或6.

意思是,12345 和 123456 应该有效,但 12345.0 或 123456.0 不应该。

List<Regex> regexPatterns = new List<Regex>{
    new Regex(@"\b\d{5,6}\b"),              // 0
    new Regex(@"\b\d{5,6}[.](00)\b")        // 1
}

string text = "00000.00";

for( int i = 0; i < regexPatterns.Count; i++ ) {
    if( regexPatterns.IsMatch(text) ) return i;
}

当我希望它返回 1 时,这会一直为 00000.00 返回 0。

** 索引是有意义的,所以重新排序是不行的。

【问题讨论】:

  • 我认为您的问题是句点充当单词边界,导致匹配发生在您的第一个表达式上。如果您可以反转表达式并先测试较长的表达式,那么您应该得到一个匹配项。

标签: c# regex


【解决方案1】:

尝试^$ 作为字符串的开头和结尾:

List<Regex> regexPatterns = new List<Regex>{
    new Regex(@"^\d{5,6}$"),              // 0
    new Regex(@"^\d{5,6}[.](00)$"),       // 1
}

Regular Expression Language - Quick Reference:

^ 匹配必须从字符串或行的开头开始。

$ 匹配必须出现在字符串的末尾或在行或字符串末尾的\n 之前。

【讨论】:

  • 一些解释会更好,我相信这是正确的答案。
  • @user3228667 你可能做错了什么。我刚试过,效果很好。
  • @user3228667 尝试在 .在 [] 中,根据 StuffOfInterests 的评论。
  • 实际上,它似乎正在处理我的程序,但仍然没有在 regexr.com 上为我突出显示。感谢您的回答!
  • 哦,刚刚让它在网站上工作。必须先删除文本框中的所有内容。谢谢!你是最棒的!
【解决方案2】:

由于句点将作为单词边界,您最好的选择是从最复杂的模式扫描到最简单的模式。您可以执行 for 循环递减来完成此操作,但另一种考虑的方法是使用您的模式字典,其中值组件是返回值。

var patterns = new Dictionary<string, int>
    {
        { @"\b\d{5,6}\b", 0 },
        { @"\b\d{5,6}[.](00)\b", 1 },
    };

string text = "00000.00";

foreach (var pattern in patterns.Keys)
{
    if (pattern.IsMatch(text))
        return patterns[pattern];
}

【讨论】:

    【解决方案3】:

    检查第一个没有句号:

    List<Regex> regexPatterns = new List<Regex>{
        new Regex(@"\d{5,6}[^.]"),              // 0
        new Regex(@"\d{5,6}[.](00)")        // 1
    }
    
    string text = "00000.00";
    
    for( int i = 0; i < regexPatterns.Count; i++ ) {
        if( regexPatterns.IsMatch(text) ) return i;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      相关资源
      最近更新 更多