问题描述
|
我有一个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的实现,它将变得非常难看。