これでできます。グループ 'unquote' を含むすべての一致は、必要なものと一致します。
(?<unquote>[^"'\s]+)|(?:["][^"]+?["])|(?:['][^']+?['])
C# テスト コード:
var matches = Regex.Matches( @"""we run"" live ""experiments"" inside and outside 'a lab'", @"(?<unquote>[^""'\s]+)|(?:[""][^""]+?[""])|(?:['][^']+?['])" );
foreach( Match match in matches )
{
if( match.Groups["unquote"].Success )
{
Console.WriteLine( match.Groups["unquote"].Value.Trim() );
}
}
出力:
住む
中身
と
外側
どこ:
<unquote>
unquote というグループに入れることを意味します
^"'\s
は、二重引用符またはスペース以外のすべてに一致することを意味します。
(?:["][^"]+?["])
引用符内のすべてを次の引用符に一致させることを意味します。+? に注意してください。貪欲にならないように、?: グループがキャプチャされないようにします。一重引用符でも同じです。
これは、空の文字列 "" と、単一引用符が二重引用符でネストされている文字列で機能します。アポストロフィを無視しますか? はいの場合は、正規表現を少し拡張して ' の前にスペースがないことを許可する必要があります。
(?<unquote>(?>[^"\s](?<!\s[']))+)|(?:["][^"]+?["])|(?:['][^']+?['])
ライブ実験で頑張ってください。