Вопрос по regex, php – Php ставит пробел перед заглавными буквами в строке (Regex)

29

У меня есть несколько строк, которые содержат слова, которые сгруппированы вместе, и мне нужно разделить их.

Например ThisWasCool - это было круто
MyHomeIsHere - мой дом здесь

Я медленно осваиваю регулярные выражения, и я считаю, что для этого я должен использовать preg_replace. Моя проблема - собрать выражение, чтобы найти совпадение.

У меня только так далеко

   preg_replace('~^[A-Z]~', " ", $string)

Каждая строка содержит много слов, но ТОЛЬКО первое слово содержит сгруппированные слова, поэтому, используя мой пример выше, строка будет
& quot; ThisWasCool посетить вас снова & quot; - "Это было круто, чтобы посетить вас снова"

Я сказал, чтобы начать с самого начала, и искать столицы, но я не знаю, как это сделать, - ограничить его только первым словом каждой строки - как использовать заглавную букву в заменяющей части после пробела

"\ n" для замены. Вы имели в виду пробел или перевод строки? MitMaro
поздно здесь я имел в виду пробел, обычно я просто ставил "", но это, вероятно, неправильно! Paul M

Ваш Ответ

4   ответа
59
Проблема

'~^[A-Z]~' будет соответствовать только первой заглавной букве. Проверять, выписываться Мета-символы в Синтаксис паттерна за дополнительной информацией

Твоя замена - символ новой строки'\n' а не пробел.

Решени

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

$String = 'ThisWasCool';
$Words = preg_replace('/(?<!\ )[A-Z]/', ' $0', $String);

The(?<!\ ) являетсяутверждени это гарантирует, что мы не добавим пробел перед заглавной буквой, в которой уже есть пробел.

Я понял: preg_replace ('/ (? <!) (? <! ^) [A-Z] /', '$ 0', $ String); Eineki
+ 1 спасибо .. это работает как шарм NullPoiиteя
И если вам нужен тот, который не разделяет последовательные заглавные буквы (например, BusinessUnitID должен быть идентификатором Business Unit ID, а не ID бизнес-единицы), то вы можете использовать / (? <!) (? <! ^) (? < ! [AZ]) [AZ] / Dave
Как пропустить первую заглавную букву? Eineki
13
$string = preg_replace('/[A-Z]/', ' $0', $string);

прогнать результат через LTRIM после

$string = ltrim(preg_replace('/[A-Z]/', ' $0', $string));
Спасибо, я думаю, / являются разделителями, есть ли способ ограничить его только работой с первым словом? Данные поступают из CSV, поэтому первое слово заключено в ""? Paul M
Да, есть. Я предложил использовать ltrim для удаления пробела, но вы также можете сделать это в выражении с помощью: / \ B [A-Z] / Alex Barrett
2

эта версия будет действовать только на первое слово и сохранит последовательности заглавных букв (BMW).

$str = "CheckOutMyBMW I bought it yesterday";
$parts = explode(' ', $str);
$parts[0] = preg_replace('~([a-z])([A-Z])~', '\\1 \\2', $parts[0]);
$newstr = implode(' ', $parts);
echo $newstr;
1

но я бы предложил что-то вроде следующего кода:

$string="ThisWasCool to visit you again";
$temp = explode(' ',$string, 2);
$temp[0] = preg_replace('/(.)([A-Z])/','$1 $2', $temp[0]);
$string = join(' ',$temp);

Смотря на код SirLancelot, у меня есть второе решение. Тем не менее, я предпочитаю решение взрыва, поскольку вы заявили, что ваша цель - это только первое слово в строке.

$string="ThisWasCool to visit you again";
$temp = explode(' ',$string, 2);
$temp[0] = preg_replace('/(?<!^)([A-Z])/',' $0', $temp[0]);
$string = join(' ',$temp);

Похожие вопросы