正在尝试为csv验证配置特定的Regex模式



我正在尝试使用一个正则表达式模式来匹配一个单词或引号中的一组单词,如:

"keyword""keyword1 keyword2"

和或以上任何一个以波浪号&一个数字。

"keyword"~3"keyword1 keyword2"~5

但在关键字中不包含第三个双引号,也不包含波浪号/数字的双集

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

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

然而,[^"]似乎并没有像我预期的那样在中间引用上失败,结尾的任何附加内容似乎也在通过。。。

关于如何使其更加精确,有什么建议吗?

这是失败的,因为您的正则表达式被这样处理:

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

也就是说,必须以X开头或以Y结尾。

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

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

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

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

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

您需要去掉这些锚点。该网站上使用的CSV模式源自W3C的XML模式标准,该标准指定了自己的正则表达式风格。它通常被称为XSD风格,它基于Perl5风格,但它只支持Perl及其大多数其他衍生物中可用功能的一小部分。

其中一个缺失的功能是锚。在XSD风格中,所有匹配项都隐式地锚定在两端。这听起来可能非常有限,但事实并非如此。您总是可以通过在末尾添加.*来"填充"匹配,就像使用Java的matches()方法一样。但是,在matches()允许显式添加锚点的情况下,XSD不允许。在字符类之外,^$只是普通字符。

除此之外,您要查找的正则表达式非常简单:

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

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

最新更新