【问题标题】:Validating items in CSV with regex使用正则表达式验证 CSV 中的项目
【发布时间】:2011-09-04 06:12:15
【问题描述】:

我有一个 CSV 字符串,我试图通过正则表达式进行验证,以确保它只有 N 个项目。我尝试了以下模式(查找 2 个项目):

/([^,]+){2}/

但它似乎不起作用,我猜是因为内部模式不够贪婪。

有什么想法吗?理想情况下,它应该适用于 PHP 和 Javscript 正则表达式引擎。

更新:

出于技术原因,我真的想通过正则表达式而不是其他解决方案来做到这一点。 CSV 没有被引用,并且值不会包含逗号,所以这不是问题。

/([^,]*[,]{1}[^,]*){1}/

是我现在所处的位置,哪种可行但仍然有点难看,并且在匹配一个项目时存在问题。

CSV 看起来像:

apples,bananas,pears,oranges,grapefruit

【问题讨论】:

    标签: php javascript regex csv


    【解决方案1】:

    在 PHP 中,使用这个函数会更好:

    http://www.php.net/manual/en/function.str-getcsv.php

    它将处理以下问题:

    a,"b,c"
    

    ...它包含两个而不是三个。

    我不知道 javascript 的等效函数。

    【讨论】:

      【解决方案2】:

      未经测试,因为我不知道您的输入是什么样的:

      /^([^,]+,){1}([^,]+$)/
      

      这需要两个字段(一个逗号,所以最后一个字段后没有逗号)。

      【讨论】:

      • {1} 只是噪音,可以放心地省略。
      • 没错,我把它放在那里是因为如果你想让它匹配更多项目,它会显示要重复的内容。
      • 那将失败。如果这也应该匹配(因为它是有效的 csv),他们应该寻求您的答案。 :)
      【解决方案3】:
      var vals       = "something,sthelse,anotherone,woohoo".split(','),
          maxlength = 4;
      
      return vals.length<=maxlength
      

      应该在 js 中工作。

      【讨论】:

      • 如果数据中包含带逗号的引用文本则不起作用。
      • 原来如此,没想到。
      【解决方案4】:

      根据 CSV 的格式,它可能能够在 /\",\"/ 上拆分(即 double_quote 逗号 double_quote)并获得结果数组的长度。

      正则表达式不太适合解析,所以如果字符串很复杂,你可能需要用其他方式解析它。

      【讨论】:

        【解决方案5】:

        如何使用g (global) 修饰符使正则表达式更贪婪?

        var foobar = 'foo,bar',
            foobarbar = 'foo,bar,"bar"',
            foo = 'foo,',
            bar = 'bar';
        foo.match(/([^,]+)/g).length === 2; //=> false
        bar.match(/([^,]+)/g).length === 2; //=> false
        foobar.match(/([^,]+)/g).length === 2; //=> true
        foobarbar.match(/([^,]+)/g).length === 2; //=> false
        

        【讨论】:

          【解决方案6】:

          知道了。

          /^([^,]+([,]{1}|$)){1}$/
          

          将最后一个 {N} 设置为要检查的结果数量或范围 {1,3}。

          【讨论】:

            【解决方案7】:

            看看this answer

            引用:

            re_valid = r"""
            # Validate a CSV string having single, double or un-quoted values.
            ^                                   # Anchor to start of string.
            \s*                                 # Allow whitespace before value.
            (?:                                 # Group for value alternatives.
              '[^'\\]*(?:\\[\S\s][^'\\]*)*'     # Either Single quoted string,
            | "[^"\\]*(?:\\[\S\s][^"\\]*)*"     # or Double quoted string,
            | [^,'"\s\\]*(?:\s+[^,'"\s\\]+)*    # or Non-comma, non-quote stuff.
            )                                   # End group of value alternatives.
            \s*                                 # Allow whitespace after value.
            (?:                                 # Zero or more additional values
              ,                                 # Values separated by a comma.
              \s*                               # Allow whitespace before value.
              (?:                               # Group for value alternatives.
                '[^'\\]*(?:\\[\S\s][^'\\]*)*'   # Either Single quoted string,
              | "[^"\\]*(?:\\[\S\s][^"\\]*)*"   # or Double quoted string,
              | [^,'"\s\\]*(?:\s+[^,'"\s\\]+)*  # or Non-comma, non-quote stuff.
              )                                 # End group of value alternatives.
              \s*                               # Allow whitespace after value.
            )*                                  # Zero or more additional values
            $                                   # Anchor to end of string.
            """
            

            或者可用的形式(因为JS不能处理多行正则表达式字符串):

            var re_valid = /^\s*(?:'[^'\\]*(?:\\[\S\s][^'\\]*)*'|"[^"\\]*(?:\\[\S\s][^"\\]*)*"|[^,'"\s\\]*(?:\s+[^,'"\s\\]+)*)\s*(?:,\s*(?:'[^'\\]*(?:\\[\S\s][^'\\]*)*'|"[^"\\]*(?:\\[\S\s][^"\\]*)*"|[^,'"\s\\]*(?:\s+[^,'"\s\\]+)*)\s*)*$/;
            

            可以使用 RegEx.test() 调用

            if (!re_valid.test(text)) return null;
            

            第一个匹配项查找有效的单引号字符串。第二个匹配查找有效的双引号字符串,第三个查找不带引号的字符串。

            如果您删除单引号匹配,则它几乎 100% 实现了有效的 IETF RFC 4810 规范 CSV 验证器。

            注意:它可能是 100%,但我不记得它是否可以处理值中的换行符(我认为 [\S\s] 是用于检查换行符的特定于 javascript 的 hack)。

            注意:这是一个仅限 JavaScript 的实现,不能保证 RegEx 源字符串在 PHP 中有效。

            如果您打算对 CSV 数据做任何重要的事情,我建议您采用现有的库。如果您正在寻找符合 RFC 的实现,它会变得非常难看。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-11-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-08-13
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多