0

私はこの文字列を持っています:

IMD+F++:::PS4 SAINTS R IV R?+GA'

2段階に分けたいと思います。まず、エスケープされたプラス記号 "?+" を除いて + で分割したいと思います。次に、エスケープされたコロン「?:」を除いて、: で結果を分割します。

次の正規表現を使用すると、文字列を正常に分割できます。

string[] Data = Regex.Split("IMD+F++:::PS4 SAINTS R IV R?+GA'", @"(?<![\?])[\+]+"); 

結果:

[0] IMD
[1] F
[2] :::PS4 SAINTS R IV R?+GA'

結果は正しくありません。配列への 4 つの入力である必要があります。空の結果を削除します。配列にとどまるには、空の結果が必要です。結果は次のようになります。

[0] IMD
[1] F
[2]
[3] :::PS4 SAINTS R IV R?+GA'

なぜこのように振る舞うのか誰にも分かりますか?助言がありますか?

4

2 に答える 2

3

「少なくとも1つのプラス」で分割したいと明示的に言っています-それが[\+]+意味することです. ++そのため、単一の区切りとして扱っています。1 つのプラスで分割するだけです。それを一連の文字に入れる必要がないことに注意してください。

string[] data = Regex.Split("IMD+F++:::PS4 SAINTS R IV R?+GA'", @"(?<!\?)\+");

文字のセットに入れたい場合は、エスケープする必要はありません。上記でエスケープする唯一の理由は、「これはグループ量指定子ではなく、単なるプラス文字です」と言うためです。したがって、これも同様に優れています。

string[] data = Regex.Split("IMD+F++:::PS4 SAINTS R IV R?+GA'", @"(?<![?])[+]");
于 2015-01-23T07:32:11.637 に答える
2

+文字クラスの後ろを削除するだけです。+ 前のトークンに 1 回以上貪欲に一致するためです。したがって、この[\+]+正規表現は、単一のプラスだけでなく、次のプラスにも一致します。

string[] Data = Regex.Split("IMD+F++:::PS4 SAINTS R IV R?+GA'", @"(?<![?])[+]")
于 2015-01-23T07:31:39.387 に答える