Regex для удаления ВСЕХ отдельных символов из строки

7

Мне нужно регулярное выражение, чтобы удалить ВСЕ отдельные символы из строки, а не только отдельные буквы или цифры

Строка:

"Будущее Казино Каратэ Каратэ (Prod By Metro)"

он должен выглядеть следующим образом:

"Future Ft Casino Karate Chop Prod By Metro"

Выражение, которое я использую в данный момент (в PHP), правильно удаляет сингл 'A', но оставляет одиночный '(' и ')'

Это код, который я использую:

$string = preg_replace('/\b\w\b\s?/', '', $string); 
  • 1
    Для объяснения: \b будет совпадать только между тем, что соответствует \w и чем-то, совпадающим с \W Поскольку <space> и ( соответствует \W , между ними нет границы. Комментарии можно редактировать только в течение 5 минут (нажмите на это поле, чтобы закрыть)
  • 0
    Большое спасибо за быстрые ответы и объяснения. В итоге $string = preg_replace('/(^| ).( |$)/', '$1', $string); отлично работает для того, что мне нужно
Теги:

2 ответа

10
Лучший ответ

Попробуйте следующее:

(^| ).( |$)

Структура:

   1.  (^| )  ->  Beginning of line or space  
   2.  .      ->  Any character  
   3.  ( |$)  ->  Space or End of line

Фактический код:

$string = preg_replace('/(^| ).( |$)/', '$1', $string); 

Примечание. Я не знаком с работой регулярного выражения PHP, поэтому для этого кода может потребоваться небольшая настройка в зависимости от того, как объявлено фактическое регулярное выражение.

Как отметил m.buettner, здесь будет следующий пробел с этим кодом. Для его устранения потребуется отделка.

Редактировать: Арнис Джурага отметил, что это не очистит несколько одиночных символов a b c, которые будут отфильтрованы до b. Если это проблема, используйте это регулярное выражение:

(^| ).(( ).)*( |$)

Добавленный в середину (( ).)* будет искать любое пространство, следующее за любым символом 0 или более раз. Недостатком является то, что это приведет к двойным пространствам, где была размещена серия одиночных символов.

Смысл этого:

The a b c dog

Это станет следующим:

The  dog

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

( ){2}
  • 1
    +1, единственный, который действительно соответствует требованиям.
  • 0
    @Daedalus спасибо за ваш комментарий в моем вопросе. Точно не понял вопроса - ответ отозван.
Показать ещё 9 комментариев
6

Несколько более эффективная версия, которая не требует захвата, будет использовать lookarounds. Это немного менее интуитивно понятно из-за множественной отрицательной логики:

$string = preg_replace('/(?<!\S).(?!\S)\s*/', '', $input);

Это приведет к удалению любого символа ни, предшествующего , ни, за которым следует символ не -whitespace (так что только те, которые находятся между пробелами или на границах строк). Он также будет включать все конечные пробелы в матче, чтобы оставить только предыдущие пробелы, если они есть. Предостережение заключается в том, что, как и Ник, ответ на ) в конце строки оставит конечный пробел (потому что он находится перед символом). Это легко решить с помощью trim ming строки.

  • 0
    одинаково хорошо, если не лучше, большое спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню