0

私は文を持っています:

「これは単なる例です」

最初の ' ' 文字の間で単語を切り取る必要があります。

今まで、次の正規表現メソッドを使用していました。

string name_only = Regex.Match("This 'is' just an example", @"\'([^)]*)\'").Groups[1].Value;

結果: です

別の ' が表示されるまで、それは完全に正常に機能しました。

「これは単なる例です」

今私は得ています:

結果: is' just an e

この問題を修正するにはどうすればよいですか (「for」サイクルを使用して反復し、文字 ' の最初の 2 つの inexes を見つけてから、部分文字列を使用して単語を切り取る以外に) ?

4

3 に答える 3

2

問題は、正規表現が貪欲な方法で動作し、次のように変更すると機能することです。

@"\'([^)]*?)\'"
于 2012-10-15T18:48:20.887 に答える
1

デフォルトでは、正規表現は「左端の最長のルール」に従います。つまり、可能な限り左端の最長の部分文字列に一致します。

正規表現を何に一致させるべきかについてより具体的にしたいと思います。したがって、次のようになります。

'(([^']|(''))*)'

それは一致するはずです:

  • リードインの一重引用符文字とそれに続く
  • の0個以上のインスタンス
    • 一重引用符以外の単一文字、または
    • 「エスケープされた」一重引用符文字:2つの連続する一重引用符文字、
  • リードアウトの一重引用符文字が続きます。

次に、$ 0で一致全体が得られ、$ 1で、リードイン/リードアウトの引用符を除いて、一致した引用符の値の内容が得られます。

于 2012-10-15T19:39:10.890 に答える
0

http://msdn.microsoft.com/en-us/library/3206d374.aspx#Greedy

貪欲で怠惰な量指定子

多くの量指定子には 2 つのバージョンがあります。

  1. 貪欲なバージョン。

    貪欲な量指定子は、要素を可能な限り何度も一致させようとします。

  2. 非貪欲 (または遅延) バージョン。

    貪欲でない量指定子は、できるだけ少ない回数だけ要素を一致させようとします。単に ? を追加するだけで、貪欲な量指定子を怠惰な量指定子に変えることができます。

于 2012-10-15T19:52:16.130 に答える