2016-11-04 2 views
1

Попытка удалить все символы, кроме как из комбинации «r d». Чтобы быть более ясным некоторые примеры:удаление одной буквы, за исключением составов

a ball -> ball r something -> something d someone -> someone r d something -> r d something r something d -> something

До сих пор мне удалось удалить буквы, кроме как от r или d, но это не то, что я хочу. Я хочу сохранить только состав (пример 4). Я использую это:

\b(?!r|d)\w{1}\b

Любая идея, кто это делать?

Редактировать: Двигатель регенератора поддерживает lookbehinds.

+1

Какой у вас двигатель регулярных выражений? Поддерживает ли он lookbehinds? Вам нужно разрешить несколько пробелов между 'r' и' d'? – Ryan

ответ

1

Вы можете захватить r d комбинации и использовать обратную ссылку в шаблоне замены, чтобы восстановить эту комбинацию, и удалите все остальные матчи:

\b(r d)\b|\b\w\b\s* 

Смотрите regex demo (заменить $1, что поставит r d обратно в результат).

Детали:

  • \b(r d)\b - это "целое слово" r d, который захватывается в группе 1
  • | - или
  • \b\w\b\s* - единое целое слово, состоящее из 1 буквы/цифры/подчеркивание (\b\w\b) и последующие пробелы 0+ (\s*, просто для удаления лишних пробелов, возможно, не обязательно).
+0

Спасибо за объяснение! Является ли '\ s *' таким же, как '+'? –

+0

'\ s' соответствует символам пробела (набор может варьироваться между ароматами регулярных выражений), а буквальное пространство соответствует только регулярному пространству. В вашей ссылке regex101 выше вы заменили совпадение пустой строкой, таким образом, вы также удалили все захваченные тексты. [Используйте '$ 1' в качестве строки замены.] (Https://regex101.com/r/GU3skZ/2) См. Мой ответ: *** (замените на' $ 1', который вернет 'rd' в результат) *** –

+0

да видел это позже. Спасибо в любом случае :) –