【问题标题】:Regular expression matching with any string at the end正则表达式与末尾的任何字符串匹配
【发布时间】:2014-07-22 20:59:57
【问题描述】:

我有一个要加载的脚本文件,但我似乎无法让我的正则表达式工作。我的正则表达式有点生疏,但我很惊讶我的正则表达式不起作用。

基本上,每一行(除了空白行和以注释(“//”)开头的行除外)应采用以下格式:

[decimal number],[hex number],[hex number],[any string of characters]

因此,例如,每个非空白行或完全注释的行都应如下所示:

01, 0x00100204, 0x00000000, some string goes here

我的匹配模式如下

"[0-9]+[\\s]+,0[xX][0-9a-fA-F]+[\\s]+,0[xX][0-9a-fA-F]+[\\s]+,"

我省略了尾部(字符串所在的位置),因为根据我对正则表达式的理解,只要它可以找到与匹配模式匹配的子字符串,它就会匹配。我在这里做出了正确的假设吗?

----编辑 -----
我还想指出,我不在乎数字末尾和下一个逗号之间有多少空格,因此是 [\\s]+

【问题讨论】:

  • 格式和示例不匹配。格式中没有空格,但在示例中, 之后有一个空格,并且您的正则表达式正在搜索, 之前的空格
  • 不清楚你想要什么。您只想知道一行是否与您的正则表达式匹配,还是您想捕捉尾随字符串?请更具体地说明您想要获得的内容。
  • 您将需要使用* 而不是+ 来计算空间中的“不关心”,因为+ 将匹配一个或多个,* 是零或多个
  • 您可以通过在线测试人员检查您的正则表达式。例如,请参阅 regex101.comregexpal.com
  • 感谢瑞恩的提示,我不知道那个

标签: c# .net regex string


【解决方案1】:

您的正则表达式应如下所示:

"[0-9]+,\\s*0[xX][0-9a-fA-F]+,\\s*0[xX][0-9a-fA-F]+,\\s*"

匹配整个字符串的更好方法是:

@"(?mi)^[0-9]+,\s*0x[0-9a-f]+,\s*0x[0-9a-f]+,.*$"

如果您知道您之间总会有1 或更多空白字符,请改用\s+

【讨论】:

    【解决方案2】:

    在空格和逗号之间切换位置应该会有所帮助:

    @"\d+,\s*0[xX][0-9a-fA-F]+,\s*0[xX][0-9a-fA-F]+,\s*"
    

    最初的@ 有助于转义,你不应该写[\s]+,因为\s 已经是一个字符类,很像\d

    【讨论】:

      【解决方案3】:

      这个可以帮助你,每个部分也可以在组中使用:

      ([0-9]+),[\s]+(0[xX][0-9a-fA-F]+,\s+)(0[xX][0-9a-fA-F]+,\s+)(.+)
      

      Live Demo

      您可以使用 \d 代替 [0-9] 并更改此模式以排除任何您不希望出现在组中的内容。

      【讨论】:

        【解决方案4】:

        这里不需要正则表达式。一个简单的拆分就足够了

        string input = "01, 0x00100204, 0x00000000, some string goes here";
        
        var parts = input.Split(new char[] { ',' }, 4, StringSplitOptions.RemoveEmptyEntries);
        

        【讨论】:

        • 我需要确保第二个和第三个数字是十六进制格式,这样就不能完全工作
        • @audiFanatic 那么你的正则表达式是如何解析一个十进制数的呢? mathsisfun.com/decimals-menu.html
        • 第一个数字始终是小数,[0-9]+ 负责处理。第二个和第三个是十六进制的,所以我需要加上0x[0-9a-fA-F]+,以确保它不排除任何十六进制字符
        • @audiFanatic 一个十进制数的形式为123.456(顺便说一句:根据文化,它可以是123,456)
        • 让我澄清一下。当我说十进制时,我指的是数字的基数(二进制、八进制、十进制、十六进制等)。更具体地说,我说的是整数;第一个数字将始终是十进制整数,而不是浮点数。我说的是计算机科学意义上的decimal;不是数学意义上的。
        【解决方案5】:

        使用逐字字符串(由@ 引入)。反斜杠不需要在逐字字符串中转义。

        使用RegexOptions.IgnoreCase 选项,而不是提供大小写变体。

        string pattern = @"^\d+,\s*0x[0-9a-f]+,\s*0x[0-9a-f]+,.*$";
        MatchCollection matches = Regex.Matches(input, pattern,
                                            RegexOptions.IgnoreCase | RegexOptions.Multiline);
        

        ^$ 匹配行的开头和结尾。如果您的输入字符串包含所有行,请使用RegexOptions.Multiline 选项以使^$ 匹配任何行的开头和结尾,而不仅仅是整个字符串的开头和结尾。

        【讨论】:

          【解决方案6】:

          在您的正则表达式模式中,将逗号放在 \s+ 之前。

          根据您的需要选择。 \s 匹配任何空白字符 [\r\n\t\f ]。如果您只寻找空间,请使用空间而不是 \s

          \s*   zero or more times
          \s+   one or more times
          \s?   zero or one times
          

          【讨论】:

          • 他可能正在逃离他们。
          • []中不用转义。
          • 如果他使用托管语言,其中 '\' 被特殊处理,那么是的,他会
          • 是的,错位的逗号做到了。但是当我没有逃脱他们时,视觉工作室正在对我大喊大叫。我想是因为我在字符串实例化之前没有使用@。所以是的,我正在逃避他们。
          • @audiFanatic 是的,根据输出,你放错了逗号。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-12-18
          • 1970-01-01
          • 1970-01-01
          • 2017-09-30
          • 1970-01-01
          • 1970-01-01
          • 2010-11-23
          相关资源
          最近更新 更多