我有一个CSV字符串,我试图通过正则表达式验证,以确保它只有N个项目。我尝试过以下模式(寻找2个项目):
/([^,]+){2}/
但它似乎不起作用,我猜是因为内在模式不够贪婪。
有什么想法吗?理想情况下,它应该适用于PHP和Javscript正则表达式引擎。
更新
由于技术原因,我真的想通过正则表达而不是另一种解决方案来做到这一点。未引用CSV且值不包含逗号,因此这不是问题。
/([^,]*[,]{1}[^,]*){1}/
我现在在哪里,哪种工作但仍然有点难看,并且有一个项目匹配的问题。
CSV看起来像:
apples,bananas,pears,oranges,grapefruit
答案 0 :(得分:5)
在PHP中,使用此功能会更好:
http://www.php.net/manual/en/function.str-getcsv.php
它将处理以下内容:
a,"b,c"
...包含两个而不是三个。
我不知道javascript的等效功能。
答案 1 :(得分:1)
未经测试,因为我不知道您的输入是什么样的:
/^([^,]+,){1}([^,]+$)/
这需要两个字段(一个逗号,所以在最后一个字段后面没有逗号)。
答案 2 :(得分: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
答案 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的实现,那将非常难看。