[英]Regex to select semicolons that are not enclosed in double quotes
我有类似的字符串
a;b;"aaa;;;bccc";deef
我想根据分隔符拆分字符串;
只有;
不在双引号内。 所以在分裂之后,它将是
a
b
"aaa;;;bccc"
deef
我尝试使用look-behind,但是我无法找到正确的正则表达式来进行拆分。
正则表达式可能不是正确的工具。 如果可能,您应该使用CSV库,指定;
作为分隔符和"
作为引用字符,这应该为您提供您正在寻找的确切字段。
这里所说的是一种方法,通过确保在;
之间存在偶数个引号来起作用;
我们正在考虑字符串的分割和结束。
;(?=(([^"]*"){2})*[^"]*$)
示例: http : //www.rubular.com/r/RyLQyR8F19
如果您可以在字符串中转义引号,例如a;"foo\\"bar";c
。
这是使用Python的csv模块的一个更清晰的例子:
import csv, StringIO
reader = csv.reader(StringIO.StringIO('a;b;"aaa;;;bccc";deef'),
delimiter=';', quotechar='"')
for row in reader:
print '\n'.join(row)
这有点难看,但如果你没有“在你引用的字符串里面(意思是你没有看起来像这样的字符串(”foo bar \\“badoo \\”goo“)你就可以分开”然后假设所有偶数数组元素实际上都是字符串(并将奇数元素拆分为;令牌上的组成部分)。
如果你的字符串中有“\\”,那么你首先需要将它们转换为其他临时令牌,你将在执行操作后转换回来。
这是一个小提琴......
var str = 'abc;def;ghi"some other dogs say \\"bow; wow; wow\\". yes they do!"and another; and a fifth'
var strCp = str.replace(/\\"/g,"--##--");
var parts = strCp.split(/"/);
var allPieces = new Array();
for(var i in parts){
if(i % 2 == 0){
var innerParts = parts[i].split(/\;/)
for(var j in innerParts)
allPieces.push(innerParts[j])
}
else{
allPieces.push('"' + parts[i] +'"')
}
}
for(var a in allPieces){
allPieces[a] = allPieces[a].replace(/--##--/g,'\\"');
}
console.log(allPieces)
正则表达式只会变得更加混乱,即使是微小的变化也会中断。 您最好使用任何脚本语言的csv
解析器。 Perl内置模块(因此您无需从CPAN下载,如果有任何限制),名为Text :: ParseWords允许您指定分隔符,以便您不限于,
。 这是一个示例代码段:
#!/usr/local/bin/perl
use strict;
use warnings;
use Text::ParseWords;
my $string = 'a;b;"aaa;;;bccc";deef';
my @ary = parse_line(q{;}, 0, $string);
print "$_\n" for @ary;
产量
a
b
aaa;;;bccc
deef
在战斗结束后很久就回答,因为没有人使用对我来说最简单的方式。
一旦你理解了Match All和Split是同一枚硬币的两面 ,你可以使用这个简单的正则表达式:
"[^"]*"|[^";]+
查看Regex演示中的匹配项。
|
匹配完整的引用字符串 ;
也不"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.