2014-07-21 5 views
1

у меня есть список номеров, как следующее:Удаление номера из списка разделенных запятыми чисел

[123,45,6,78,9] 
[45] 
[45,123,456] 
[1234,45] 
[] 
[123,4,67,8,9] 

Предположим, что я хочу, чтобы удалить номер 45 быть удалены с минимальными откатами, как это возможно, я написал следующее regex:

(\[)((?=\])|(45(?=\])|45,|(?>([^,]|,(?!45(?:,|\])))))([^\]\]) 

Данное регулярное выражение работает для всех случаев, за исключением последнего случая, любая помощь будет оценена по достоинству.

+0

что-нибудь под последним случаем? –

+0

Каким будет ожидаемый результат? –

+0

Это регулярное выражение недействительно - есть некоторые закрытые круглые скобки и скобки - не могли бы вы это проверить? –

ответ

2

Используйте это:

(?<=\[)45,?|,?\b45\b 

В C#:

resultString = Regex.Replace(yourString, @"(?<=\[)45,?|,?\b45\b", ""); 

В the regex demo, посмотрите на замену s внизу.

Объяснение

  • Мы сопрягать 45 в двух случаях, по обе стороне от | чередования
  • На левой стороне, просмотр назад (?<=\[) утверждает, что предшествует является [
  • 45,? матчей 45 и необязательная запятая
  • OR |
  • ,? соответствует необязательной запятой
  • и \b45\b в пределах границ слова
+0

FYI: добавлена ​​демо-версия regex, код C# и объяснение. :) – zx81

+0

Как насчет пустого случая '[]' или случая, когда '45' не содержится? –

+0

@babbupandey: тогда регулярное выражение ничего не делает. Почему бы вам не проверить его? Он даже предоставил тестовую ссылку ... –

2

Regex:

(?<!\[),45\b|(?<=\[)45,|(?<=\[)45(?=\]) 

Замена строки:

empty string 

DEMO

Она удаляет номер 45 из разделенных запятой строки.

C# код будет,

string str = @"[123,45,6,78,9] 
[45] 
[45,123,456] 
[1234,45] 
[] 
[123,4,67,8,9]"; 
string result = Regex.Replace(str, @"(?<!\[),45\b|(?<=\[)45,|(?<=\[)45(?=\])", ""); 
Console.WriteLine(result); 
Console.ReadLine(); 
} 

IDEONE

+0

Как показывает ваша демонстрация, она не удаляет '45' из' [45] '. –

+0

спасибо Тиму. Обновлено. –

1

я думал, что @JleruOHeP поставил бы ответ, но я считаю, что регулярное выражение с наималейшими возвратами то, которую он использовал, с немного тонкой настройки, чтобы сделать его еще более возвратами бесплатно:

@"\b(?:,45|45,?)\b" 

с тестовых случаев выше занимает 16, 44, 16 и 46 шагов, соответственно, как показано на отладчик here (вы должны нажать на «регулярных выражений отладчик "на листе ft, чтобы просмотреть количество шагов для каждого совпадения).

Причина, по которой нижняя обратная трассировка заключается в том, что вышеизложенное не использует обратные отображения, которые добавляют некоторые накладные расходы.

+0

Oh Wow !! Спасибо Jerry –

+0

@babbupandey Мое удовольствие :) – Jerry

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