2016-09-09 2 views
2

Из следующей строки «test S9.98 Sep», я хочу удалить S перед номерами , Но не от «test» или «Sep», использующего RegEx.Удалить S из «S9.98», но не из «Sep» в строке «S9.98 Sep» с использованием Regex

Я попробовал этот

string result = Regex.Replace("test S9.98 Sep", "S(?!^Sep$)", "", RegexOptions.IgnoreCase); 

или

string result = Regex.Replace("test S9.98 Sep", "[S]", "", RegexOptions.IgnoreCase); 

Но я получаю "тет 9,98 ер"

+2

Будет ли работать '' S (? = \ D) '? – sln

+0

'(S) [0-9]' будет даже работать правильно? –

+0

@sln да, S (? = \ D) тоже будет работать. –

ответ

2

Вы можете использовать опережения регулярное выражение так:

string result = Regex.Replace("test S9.98 Sep", @"S(?=\d+(?:\.\d+)?)", "", RegexOptions.IgnoreCase); 

S(?=\d+(?:\.\d+)?) положительный lookahead, который будет соответствовать букве S, только если за ним сразу следует целое или десятичное число.

Ссылка:Lookahead and Lookbehind Zero-Length Assertions

+2

Я отметил это как ответ, так как это был первый правильный ответ плюс бонусная ссылка lookahead. Спасибо вам всем. –

+0

Но так много лишних вещей, чтобы проверить внутри взгляда. –

2

Ваш опережения довольно близко. Единственная проблема заключается в том, что ваш опережения искал Sep снова, в то время как S уже согласован:

string result = Regex.Replace("test S9.98 Sep", "\\bS(?!ep(\\b|$))", "", RegexOptions.IgnoreCase); 

Demo

+0

Вы отвечаете на возврат «tet 9.98 Sep», удаляя s из «теста» –

+0

@AlexMendez Упс, забыл удвоить косую черту. Я также обновил демо. – dasblinkenlight

+0

Теперь идентификатор не удаляет S из номеров «test S9.98 Sep» –

2

Используйте положительный взгляд вперед после S и границ слова перед ним.

string result = Regex.Replace("test S9.98 Sep", @"\bS(?=\d)", "", RegexOptions.IgnoreCase); 

(?=\d) положительный предпросмотр позволит соответствие S перед цифрой (не включая цифры в матче). Для границы слова потребуется S, чтобы появиться после символа nonword (или начала строки).

Смежные вопросы