如何匹配整个字符串而不仅仅是部分字符串

本文关键字:字符串 不仅仅是部 何匹配 | 更新日期: 2023-09-27 18:25:04

我有一个正则表达式列表,我迭代这些正则表达式以找到字符串的匹配模式。

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

也就是说,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。

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

如何匹配整个字符串而不仅仅是部分字符串

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

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

请参阅正则表达式语言-快速参考:

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

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

由于句点将充当单词边界,您最好的选择是从最复杂的模式扫描到最简单的模式。您可以进行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];
}

检查第一个中是否没有周期

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;
}
相关文章: