2

引用符の間に文字列を取得したいのですが、次のような
解決策を知っています。

/'.*?'/


しかし、問題は、たとえば英語の所有格や収縮格では機能しないことです。

What is the name of Mario's brother in the 'Super Mario' video games?

また

He's my brother

それらの文では機能しません

4

4 に答える 4

2

1 つのオプションは、開始前と終了後に単語の境界がないことを確認することです'

/\B'.*?'\B/

単語の文字 (通常は、正規表現の文字、数字、アンダースコア) と単語以外の文字 (その他または文字列の末尾) の間の位置は、単語の境界 ( \b) を構成します。他のすべての位置は によって一致し\Bます。

動作デモ。

単語境界についてさらに読む。

ちなみに、二重引用符も許可したい場合は、後方参照を使用して一貫した区切りを確保できます。

/\B(['"]).*?\1\B/

['"]2回だけ使用すると、次のようなものhere "my' stringで一致が得られますが、これはおそらく望ましくありません。正規表現の定義方法によっては、引用符の 1 つをエスケープする必要がある場合があることに注意してください。

于 2012-11-28T20:09:48.617 に答える
1

.NET Regex フレーバーにはバランシング グループがあり、それをサポートする C 用の Regex ライブラリもあるかもしれません。少なくともバランシンググループを使用したソリューションは次のとおりです。

(?<NestingCount>\B'\b)(?:(?<NestingCount>\B'\b)|(?<-NestingCount>\b(?:[?])?'\B)|.)+?(?(NestingCount)(?!))

これは、両方の例で機能します(「」で囲まれていると仮定します)。

私のソリューションに関するいくつかのコメント:

  • ネストされた引用テキスト (「スーパーマリオ」など) を識別できるように、バランシング グループを使用します。
  • 引用の開始を で識別し\B'\bます。
  • 引用符の終わりを で識別し\b(?:[?])?'\Bます。その(?:[?])?部分は、オプションの ? マークで単語を終了できるようにすることです[?]。存在する必要がある他の単語の末尾を忘れた場合は、グループ ( ) にさらに追加できます。
于 2012-11-28T21:05:01.363 に答える
0

シンプルなパターンでどうぞ/\B'.*?'\B/

于 2012-11-29T00:26:32.733 に答える