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

问题描述

| 我有一个CSV字符串,我正尝试通过正则表达式进行验证,以确保它只有N个项目。我尝试了以下模式(查找2个项目):
/([^,]+){2}/
但我想这似乎行不通,因为内部模式不够贪婪。 有任何想法吗?理想情况下,它应该与PHP和Javscript regex引擎一起使用。 更新: 由于技术原因,我真的想通过正则表达式而不是其他解决方案来做到这一点。 CSV不加引号,并且值将不包含逗号,因此这不是问题。
/([^,]*[,]{1}[^,]*){1}/
是我现在的位置,是哪种作品,但仍然有点难看,并且存在与一项匹配的问题。 CSV看起来像:
apples,bananas,pears,oranges,grapefruit
    

解决方法

        在PHP中,使用此功能会更好: http://www.php.net/manual/zh/function.str-getcsv.php 它将处理以下问题:
a,\"b,c\"
...包含两个项目,而不是三个。 我不知道javascript的等效功能。     ,        未经测试,因为我不知道您的输入是什么样的:
/^([^,]+,){1}([^,]+$)/
这需要两个字段(一个逗号,因此最后一个字段后没有逗号)。     ,        如何使用
g
global
)修饰符使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
    ,        
var vals       = \"something,sthelse,anotherone,woohoo\".split(\',\'),maxlength = 4;

return vals.length<=maxlength
应该在js中工作。     ,        根据CSV的格式,它可以在ѭ9上分割(即double_quote逗号double_quote)并获取结果数组的长度。 正则表达式对于解析不是很好,因此,如果字符串很复杂,则可能需要以其他方式解析它。     ,        得到它了。
/^([^,]+([,]{1}|$)){1}$/
将最后一个{N}设置为要检查的结果数量或范围{1,3}。     ,        看一下这个答案。 去引用:
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\\\\]+)*  # 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*)*$/;
可以使用RegEx.test()调用它
if (!re_valid.test(text)) return null;
第一个匹配项查找有效的单引号字符串。第二个匹配项寻找有效的双引号字符串,第三个匹配项寻找无引号的字符串。 如果删除单引号匹配项,则它是工作的IETF RFC 4810规范CSV验证器的几乎100%的实现。 注意:可能是100%,但我不记得它是否可以处理值中的换行符(我认为[\\ S \\ s]是检查换行符的特定于javascript的hack)。 注意:这是仅JavaScript的实现,不能保证RegEx源字符串可以在PHP中工作。 如果您打算对CSV数据进行不重要的操作,建议您采用现有的库。如果您正在寻找符合RFC的实现,它将变得非常难看。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...