试图找出csv验证的特定正则表达式模式

时间:2015-10-27 03:12:23

标签: regex csv

我正在尝试使用匹配单词的正则表达式模式,或者引号中的单词集合,如:

"keyword""keyword1 keyword2"

或者上述任何一种以波浪形和极端结束一个号码。

"keyword"~3"keyword1 keyword2"~5

但是在关键字中不包含第三个双引号,或者是波形符/数字的双重集合

失败:"keyword1" keyword2""keyword"~3~3

到目前为止,我有这个:^(\[\"\](\[^\"\'\]*)\[\"\])|(\"(\[^\"\'\]*)\"~\d)$/gm

然而,[^\"]似乎并没有像我期望的那样在中间引号上失败,而且最后的任何其他内容似乎都在传递......

关于如何使其更精确的任何建议?

2 个答案:

答案 0 :(得分:0)

这是失败的,因为你的正则表达式被这样对待:

^([\"]([^\"\']*)[\"])(\"([^\"\']*)\"~\d)$

即,必须以X开头或以Y结尾。

如果您的CSV中的字段为"this "should fail",则它将与正则表达式的第一部分匹配,因为元字符$与之关联,因此通过验证。

如果用括号括起整个正则表达式(不包括开始/结束锚点),它应该可以工作:

^(([\"]([^\"\']*)[\"])|(\"([^\"\']*)\"~\d))$

然后它将被视为整个输入必须匹配X或必须完全为Y.

或者这个更简单的版本也应该有效:^"[^'"]*"(~\d)?$

答案 1 :(得分:0)

你需要摆脱那些锚点。该站点上使用的CSV模式来自W3C的XML Schema标准,该标准指定了自己的正则表达式风格。通常称为XSD风味,它基于Perl 5风格,但它仅支持Perl及其大多数其他衍生产品中可用功能的一小部分。

其中一个缺失的功能是锚点。在XSD风格中,所有匹配都隐含地锚定在两端。这可能听起来非常有限,但事实并非如此。您可以通过向末尾添加.*来“填充”匹配,就像使用Java的matches()方法一样。但是matches()允许你无论如何都明确添加锚点,而XSD则不然。在字符类之外,^$只是普通字符。

除此之外,你正在寻找的正则表达式非常简单:

"[^"]+"(?:~\d+)?

我更新了 fiddle 以进行演示。请注意,我在小提琴中使用了锚,但你不应该。这是一种解决方法,因为Regex101没有设置假装每一行是一个独立的字符串,就像其他一些工具一样。出于同样的原因,我在[^"\r\n]中添加了行分隔符;你可能不需要它们。