Мне нужно регулярное выражение, чтобы удалить ВСЕ отдельные символы из строки, а не только отдельные буквы или цифры
Строка:
"Будущее Казино Каратэ Каратэ (Prod By Metro)"
он должен выглядеть следующим образом:
"Future Ft Casino Karate Chop Prod By Metro"
Выражение, которое я использую в данный момент (в PHP), правильно удаляет сингл 'A', но оставляет одиночный '(' и ')'
Это код, который я использую:
$string = preg_replace('/\b\w\b\s?/', '', $string);
Попробуйте следующее:
(^| ).( |$)
Структура:
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}
Несколько более эффективная версия, которая не требует захвата, будет использовать lookarounds. Это немного менее интуитивно понятно из-за множественной отрицательной логики:
$string = preg_replace('/(?<!\S).(?!\S)\s*/', '', $input);
Это приведет к удалению любого символа ни, предшествующего , ни, за которым следует символ не -whitespace (так что только те, которые находятся между пробелами или на границах строк). Он также будет включать все конечные пробелы в матче, чтобы оставить только предыдущие пробелы, если они есть. Предостережение заключается в том, что, как и Ник, ответ на )
в конце строки оставит конечный пробел (потому что он находится перед символом). Это легко решить с помощью trim
ming строки.
\b
будет совпадать только между тем, что соответствует\w
и чем-то, совпадающим с\W
Поскольку<space>
и(
соответствует\W
, между ними нет границы. Комментарии можно редактировать только в течение 5 минут (нажмите на это поле, чтобы закрыть)$string = preg_replace('/(^| ).( |$)/', '$1', $string);
отлично работает для того, что мне нужно