繁体   English   中英

正则表达式选择未用双引号括起来的分号

[英]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“)你就可以分开”然后假设所有偶数数组元素实际上都是字符串(并将奇数元素拆分为;令牌上的组成部分)。

如果你的字符串中有“\\”,那么你首先需要将它们转换为其他临时令牌,你将在执行操作后转换回来。

这是一个小提琴......

http://jsfiddle.net/VW9an/

    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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM