引用符の間に文字列を取得したいのですが、次のような
解決策を知っています。
/'.*?'/
しかし、問題は、たとえば英語の所有格や収縮格では機能しないことです。
What is the name of Mario's brother in the 'Super Mario' video games?
また
He's my brother
それらの文では機能しません
1 つのオプションは、開始前と終了後に単語の境界がないことを確認することです'
。
/\B'.*?'\B/
単語の文字 (通常は、正規表現の文字、数字、アンダースコア) と単語以外の文字 (その他または文字列の末尾) の間の位置は、単語の境界 ( \b
) を構成します。他のすべての位置は によって一致し\B
ます。
ちなみに、二重引用符も許可したい場合は、後方参照を使用して一貫した区切りを確保できます。
/\B(['"]).*?\1\B/
['"]
2回だけ使用すると、次のようなものhere "my' string
で一致が得られますが、これはおそらく望ましくありません。正規表現の定義方法によっては、引用符の 1 つをエスケープする必要がある場合があることに注意してください。
.NET Regex フレーバーにはバランシング グループがあり、それをサポートする C 用の Regex ライブラリもあるかもしれません。少なくともバランシンググループを使用したソリューションは次のとおりです。
(?<NestingCount>\B'\b)(?:(?<NestingCount>\B'\b)|(?<-NestingCount>\b(?:[?])?'\B)|.)+?(?(NestingCount)(?!))
これは、両方の例で機能します(「」で囲まれていると仮定します)。
私のソリューションに関するいくつかのコメント:
\B'\b
ます。\b(?:[?])?'\B
ます。その(?:[?])?
部分は、オプションの ? マークで単語を終了できるようにすることです[?]
。存在する必要がある他の単語の末尾を忘れた場合は、グループ ( ) にさらに追加できます。シンプルなパターンでどうぞ/\B'.*?'\B/