我正在尝试使用匹配单词的正则表达式模式,或者引号中的单词集合,如:
"keyword"
或"keyword1 keyword2"
或者上述任何一种以波浪形和极端结束一个号码。
"keyword"~3
或"keyword1 keyword2"~5
但是在关键字中不包含第三个双引号,或者是波形符/数字的双重集合
失败:"keyword1" keyword2"
,"keyword"~3~3
到目前为止,我有这个:^(\[\"\](\[^\"\'\]*)\[\"\])|(\"(\[^\"\'\]*)\"~\d)$/gm
然而,[^\"]
似乎并没有像我期望的那样在中间引号上失败,而且最后的任何其他内容似乎都在传递......
关于如何使其更精确的任何建议?
答案 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]
中添加了行分隔符;你可能不需要它们。