ここに1つの答えがあります:
(?<=^([^"]|"[^"]*")*)text
これの意味は:
(?<= # preceded by...
^ # the start of the string, then
([^"] # either not a quote character
|"[^"]*" # or a full string
)* # as many times as you want
)
text # then the text
これを簡単に拡張して、エスケープを含む文字列も処理できます。
C# コードの場合:
Regex.Match("bla bla bla \"this text is inside a string\"",
"(?<=^([^\"]|\"[^\"]*\")*)text", RegexOptions.ExplicitCapture);
コメント ディスカッションから追加 - 拡張バージョン (行ごとに一致し、エスケープを処理します)。これに使用RegexOptions.Multiline
します:
(?<=^([^"\r\n]|"([^"\\\r\n]|\\.)*")*)text
C# 文字列では、次のようになります。
"(?<=^([^\"\r\n]|\"([^\"\\\\\r\n]|\\\\.)*\")*)text"
**
ここの代わりに使用したいので"
、そのためのバージョンがあります:
(?<=^([^*\r\n]|\*(?!\*)|\*\*([^*\\\r\n]|\\.|\*(?!\*))*\*\*)*)text
説明:
(?<= # preceded by
^ # start of line
( # either
[^*\r\n]| # not a star or line break
\*(?!\*)| # or a single star (star not followed by another star)
\*\* # or 2 stars, followed by...
([^*\\\r\n] # either: not a star or a backslash or a linebreak
|\\. # or an escaped char
|\*(?!\*) # or a single star
)* # as many times as you want
\*\* # ended with 2 stars
)* # as many times as you want
)
text # then the text
このバージョンには文字が含まれていない"
ため、リテラル文字列を使用する方がクリーンです。
@"(?<=^([^*\r\n]|\*(?!\*)|\*\*([^*\\\r\n]|\\.|\*(?!\*))*\*\*)*)text"