2017-09-30 14 views
3

空白と0または任意の多数の数字の前に0以外の任意の数字をつけ、+または - ドットに。VB/Regex:文字を前後の文字の条件に置き換えてください

これまでのところ、私はゼロが続いていないすべてのゼロまたは数字の任意の量と+またはを置き換えることができた - ドットで、この使用:。

Str1 = " 0 0c000c0+c0-c 10c0c" 
Str2 = Regex.Replace(Str1, "(?!\s+\d*)0(?!\d*[\+\-])", ".") 

これは返す ".Cを... c0 + c0-c 1.cc "、最後の部分が動作しているので、最初の部分は動作しません。

私はこのパターンに従っている場合にはゼロが置き換えられることを望む:

<stuff><not a space followed by numbers>0<other numbers not followed by a plus or minus><more stuff> 

例:

" 100c" >>> " 100c" 
"c00c10+" >>> "c..c10+" 
" 0 0cc0c0-" >>> " 0 0cc.c0-" 

私はこの仕事を得ることができますどのように?

+1

期待される結果は「 0 0c ... c0 + c0-c 10c.c'ですか? '(?<!\ s \ d *)0(?!\ d * [+ - ])'を試してください。 –

+1

[このデモ](http://regexstorm.net/tester?p=%28%3f%3c %5cd *%290%28%3f!%5cd *%5b%5c%2b%5c-%5d%29&i = + 0 + 0c000c0%2bc0-c + 10c0c%0d%0a + 100c +%3e%3e %3e ++ 100c%0d%0ac00c10%2b +%3e%3e%3e + c..c10%2b%0d%0a + 0 + 0cc0c0 - %3e%3e%3e ++ 0 + 0cc.c0-&r = 。)、期待どおりに動作しますか? –

+0

ええ、それはすべきです!どうもありがとう! –

答えて

3

lookbehindを使用する必要があります。先読みではありません。使用

(?<!\s\d*)0(?!\d*[+-]) 
^^^^^^^^^ 

regex demoを参照してください。

の後ろに\sを使用する必要はありません。単一の空白チェックで十分です。

文字クラスで+をエスケープする必要はなく、文字クラスの最後/開始にある場合は-をエスケープする必要はありません。

詳細

  • (?<!\s\d*) - ゼロ
  • (?!\d*[+-]) - 空白と0+桁が現在位置
  • 0のすぐ左にある場合に一致を失敗負後読み - 0桁の数字がある場合はマッチに失敗し、現在の位置のすぐ右に-または+が続くネガティブな先読み。
関連する問題