使用正则表达式验证CSV中的项目

时间:2011-05-29 10:12:54

标签: php javascript regex csv

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

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

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

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

更新

由于技术原因,我真的想通过正则表达而不是另一种解决方案来做到这一点。未引用CSV且值不包含逗号,因此这不是问题。

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

我现在在哪里,哪种工作但仍然有点难看,并且有一个项目匹配的问题。

CSV看起来像:

apples,bananas,pears,oranges,grapefruit

7 个答案:

答案 0 :(得分:5)

在PHP中,使用此功能会更好:

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

它将处理以下内容:

a,"b,c"

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

我不知道javascript的等效功能。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

如何使用gglobal)修饰符使RegExp贪婪?

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

答案 3 :(得分:0)

var vals       = "something,sthelse,anotherone,woohoo".split(','),
    maxlength = 4;

return vals.length<=maxlength

应该在js中工作。

答案 4 :(得分:0)

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

正则表达式对于解析不是很好,所以如果字符串很复杂,你可能需要以其他方式解析它。

答案 5 :(得分:0)

知道了。

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

将最后{N}设置为结果数量或范围{1,3}进行检查。

答案 6 :(得分:0)

看看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的黑客来检查换行符号)。

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

如果您计划使用CSV数据执行任何非常重要的操作,我建议您采用现有的库。如果您正在寻找符合RFC的实现,那将非常难看。