【问题标题】:C# string starts with a number regexC# 字符串以数字正则表达式开头
【发布时间】:2011-09-16 08:53:50
【问题描述】:

我一直在寻找一段时间来弄清楚如何确认字符串以数字开头。我遇到了一个正则表达式语句'/^\d/',我可以确认它是否以数字开头。但是我似乎无法让它在下面的代码中工作。我在if(Regex.Match(info,"/^\d/"))的声明中哪里出错了?

//String attachbody is the attachment body from an email C read into a string
string[] data = Regex.Split(attachbody, "\n");

foreach (String info in data)
{
    if (Regex.Match(info,"/^\d/"))
    {
        string[] tabbedHeaderData = Regex.Split(info, "\t");
        TicketID = tabbedHeaderData[0].ToString();
        Status = tabbedHeaderData[1].ToString();
        URL = tabbedHeaderData[2].ToString();
        InitCats = tabbedHeaderData[3].ToString();
        PostRevCats = tabbedHeaderData[4].ToString();
        ListNumClosed = tabbedHeaderData[5].ToString();

        Console.WriteLine(TicketID);
        Console.WriteLine(Status);
        Console.WriteLine(URL);
        Console.WriteLine(InitCats);
        Console.WriteLine(PostRevCats);
        Console.WriteLine(ListNumClosed);
        Console.ReadLine();
    }
}

示例数据(制表符分隔):
TicketID 状态 URL InitCats PostRevCats ListNumClosed 555555 关闭http://5555555.com/searcho 恶意网站55555

【问题讨论】:

  • 你能发布一些示例数据吗?你试过没有 / 的 regex.match 吗?
  • 那么,如上所述,你的正则表达式应该是 "^\d" 没有正斜杠。

标签: c# regex string digits


【解决方案1】:

你的正则表达式是错误的。 /.../ 是用于定义正则表达式的 javascript 约定。在 C# 中尝试这样:

if (Regex.IsMatch(info, @"^\d"))

还请注意,您应该使用返回布尔值的IsMatch 方法,否则您的代码甚至无法编译。

如果您想匹配以一位或多位数字开头的字符串:

if (Regex.IsMatch(info, @"^\d+"))

【讨论】:

  • / ... / 不是“javascript约定”。是 perl。
  • @erlando,哦,请原谅我的无知。我不知道这是来自 perl。可能是因为我一生中从未使用过 perl :-) 我只是碰巧在 javascript 中使用了这个约定。
  • 归档在“晦涩的知识”下然后.. :-) 如果没有用 new RegExp(...) 定义,Javascript 的正则表达式引擎使用 perl 样式的正则表达式的内联,在这种情况下,正则表达式不应该包含在/.../
  • 另外,如果您在 Perl 中指定正则表达式操作,您将能够使用奇数字符作为分隔符 - 即 m|^\d|代替 m/^\d/ 是可以接受的,尽管在这种情况下有点不必要。
【解决方案2】:

这是您提供给 Regex.Match 的字符串格式。

正确的格式是:

Regex.Match(info,@"^\d")

@ 表示转义字符(如反斜杠)被视为普通字符。如果没有它,您的正则表达式将需要为 "^\\d"

【讨论】:

    【解决方案3】:

    您不需要正则表达式。试试

    if (info.Length > 0 && char.IsDigit(info[0]))
    {
       ...
    }
    

    如果你想使用正则表达式,去掉// 所以它只是Regex.IsMatch(info,@"^\d")

    【讨论】:

    • 谢谢agent-j,这正是我想要的。 Stackoverflow 说我必须等待 20 分钟才能接受您的回答。谢谢!
    • agent-j 我刚刚注意到您的答案是使用 regex.match 选项而不是 regex.ismatch 选项。我不得不把答案告诉达林,因为他让我直截了当。感谢您的基础工作!
    • 这是当您使用 Regex 不支持的便携式库时的解决方案。如果有正则表达式支持更好地实现该性能
    【解决方案4】:

    你的正则表达式是错误的。 .Net 不使用 perl 风格的正则表达式。正确的表达式是@"^\d"。

    如果您不打算将 .Match 中的 MatchCollection 用于任何事情,您应该使用 Regex.IsMatch(...):

    RegEx.IsMatch(info, @"^\d")
    

    【讨论】:

      【解决方案5】:

      如果您只是想找出字符串是否以数字开头。 像上面一样,你可以跳过使用正则表达式。 只需使用子字符串,删除第一个字符并测试它是否为数字。

      现在,如果您尝试删除整个数字,那么我会将字符串转换为 char 数组,并测试这些字符。

      伪 字符串 s = "" 对于字符中的每个 c{ 如果 c 是数字,那么 s += c 别的 退出 } 将 s 转换为整数,得到字符串开头的数字。

      【讨论】:

        【解决方案6】:

        如果你不想使用正则表达式(一些面试题平台不允许使用正则表达式)和Char.IsDigit(info[0])

        您可以使用if(info[0] => 0 && info[9] <= 9) 来检查 char 是否为数字。

        如果您不想将'.' 视为数字(例如仅用于整数值),则取决于要求不要使用Char.IsDigit(info[0]),因为此函数为'.' 返回true

        【讨论】:

          猜你喜欢
          • 2021-11-04
          • 2012-08-05
          • 1970-01-01
          • 2017-07-24
          • 2014-10-28
          • 2013-08-04
          • 1970-01-01
          • 2015-05-14
          • 1970-01-01
          相关资源
          最近更新 更多