仅当不在带引号的字段中或在 2 个引号之间时才匹配字符

Jun*_*tar 4 regex perl

考虑以下字符串:

"bla ; bla"; bla
"bla "";"" bla"; bla
"bla ";" bla"; bla
Run Code Online (Sandbox Code Playgroud)

我正在尝试匹配任何;不在带引号的字段(例如"bla ; bla")中或在 2 个引号之间的内容。

换句话说,我想匹配;前两个字符串中的第二个和;最后一个字符串中的所有字符串。

这是我一直在尝试的 2 个正则表达式,但我无法制作一个适用于所有情况的正则表达式。

^(['"])(?:(?!\1).)*\1(?=;)(*SKIP)(*F)|;
^(['"])(?:(?!(?!\1)\1).)*\1(?=;)(*SKIP)(*F)|;
Run Code Online (Sandbox Code Playgroud)

任何的想法?

编辑

我在最初的问题中省略了几个重要的细节。上面的示例行来自.csv文件。我正在尝试;从不同文件的行中提取所有文件分隔符。我的问题是区分;引用字段内的引用(第 2 行)和由;(第 3 行)分隔的两个引用字段。;在我的情况下,总是跟在引用字段之后。

Sha*_*awn 5

使用实际的 CSV 解析器(好吧,分号-SV)Text::CSV_XS而不是尝试使用正则表达式来破解某些东西:

#!/usr/bin/env perl
use warnings;
use strict;
use feature qw/say/;
use Text::CSV_XS;

my $csv = Text::CSV_XS->new({ binary => 1, sep_char => ";"});

while (my $row = $csv->getline(\*DATA)) {
    say $row->[0];
}


__DATA__
"bla ; bla"; bla
"bla "";"" bla"; bla
"bla ";" bla"; bla
Run Code Online (Sandbox Code Playgroud)