【问题标题】:Check if part of string matches regex检查部分字符串是否与正则表达式匹配
【发布时间】:2014-04-30 16:20:39
【问题描述】:

我正在尝试根据各种正则表达式验证字符串;但是,如果将空格字符添加到字符串的 end,它们将不再被标记。

if (Regex.IsMatch(literal.Value.ToString().ToLower(), @"^\+?[0-9\-\(\)\.\/]{8,20}$")
{
    //Logic
}

在下面的一段代码中; X 值被标记,但 Z 值没有。

string x = "0337350670"; // Gets flagged
string z = "0337350670     "; // Does not get flagged

我应该更改我的正则表达式还是有办法针对字符串的一部分进行验证?

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    从正则表达式中删除 ^ 和 $ 将允许表达式匹配字符串中的任何位置。

    【讨论】:

    • 这里还需要加上*来开始和结束,不是吗?
    • 我确实检查过了,这不是必需的,如果你删除了 ^ 和 $ 就可以了。
    • +1 删除$ 是最快的方法。 @Matthijs 只是一个旁注,"0337350670sometext" 也会被标记,如果你只想在最后允许空格,你可以使用 "^\+?[0-9\-\(\)\.\/]{8,20}\s*$"
    • "0337350670sometext" 确实会被标记,这就是为什么这对我来说不是一个合适的答案;请查看 Robin 提出的 Trim 选项。
    • @Matthijs 你确实要求部分字符串匹配!
    【解决方案2】:

    您只需 Trim 您的字符串即可删除两边的尾随空格。

    此外,许多特殊的正则表达式字符在字符类中不再是特殊的(- 仍然是,但如果你这样说它会被转义:[...-])。

    Regex.IsMatch(literal.Value.ToString().ToLower().Trim(),
                  @"^\+?[0-9()./-]{8,20}$"
    

    删除 ^$ 也可以,但请注意,这将允许连续包含超过 20 个数字的字符串:您不再检查最大长度(任何 包含 [0-9()./-]{8}会匹配)。

    【讨论】:

    • 如果我有这样的“1283712323 327462387462”会发生什么?修剪后的字符串会变成“1283712323327462387462”吗?
    • 不,Trim 旨在仅删除尾随空格:请参阅documentation
    • 我喜欢补充说删除 $ 将允许 20+ 位数的字符串;因为这是这里的一个关键因素。你的方法最适合!
    • @Matthijs:很高兴我能帮上忙!
    【解决方案3】:

    您可以从末尾删除$字符串结尾字符并添加.*:

    if (Regex.IsMatch(literal.Value.ToString().ToLower(), @"^\+?[0-9\-\(\)\.\/]{8,20}.*")
    {
        //Logic
    }
    

    现在它将匹配两者:Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 2014-02-20
      相关资源
      最近更新 更多