проблема с регулярным выражением при нахождении «a-Z, a-Z»

#php #regex #preg-replace #preg-match

#php #регулярное выражение #preg-заменить #preg-match

Вопрос:

Я ищу, чтобы найти запятую после Оливера и перед Роем в следующей строке

 "Username,Hello Person Oli,"Oliver,Who" roy,Roy"
  

Я хочу заменить это Oliver,Who

Я использую следующее регулярное выражение

 '/^"(?:[a-zA-Z] )(?:, )(?:[a-zA-Z] )"$/'
  

Однако это не работает с preg_replace

Это мой код

 $pregData   = preg_replace('/^"(?:[a-zA-Z] )(?:, )(?:[a-zA-Z] )"$/',';',$csv);
  

Есть идеи, почему?

Извините за плохое первое сообщение.

Комментарии:

1. Между Оливером и Роем две запятые, какую из них вы хотите найти? или это и то, и другое?

2. Пожалуйста, улучшите свой вопрос.

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

4. Что, если это другая строка, такая как «Дэйв Барри, Скот Джонс»

Ответ №1:

Чтобы учесть другие символы, кроме просто a-z , вы могли бы использовать:

 /"([^,] ?),(. ?)"/
  
  • " = цитата
  • [^,] ?, = все, что не является запятой до первой запятой
  • . ?" = что-нибудь еще до следующей цитаты

Обратите внимание, что строка слева и справа от запятой фиксируется (...) конструкциями. Это означает, что если выражение совпадает, то строке слева будет присвоено значение 1 , в то время как строке справа будет присвоено значение 2 . Поэтому, если вы хотите заменить это чем-то вроде left; right , вы могли бы использовать:

 preg_replace('/"([^,] ?),(. ?)"/', '1; 2', $csv)
  

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

 preg_replace('/"([^,] ?),(. ?)"/', '1 2', $csv)
  

Комментарии:

1. Это сработало, однако, когда я использую preg_replace, возможно ли сохранить строку до и после запятой? это сработало, однако я потерял строку до и после, например, «Имя пользователя, привет, Оли,; roy, Roy» — это то, с чем я остался сейчас

Ответ №2:

Ваше регулярное выражение ищет текст только с a-z запятой в начале и a-z еще раз. Если это не соответствует вашей строке, вам следует удалить начало ( ^ ) и конец ( $ ) символов строки.

 /"(?:[a-zA-Z] )(?:, )(?:[a-zA-Z] )"/
  

Комментарии:

1. С помощью preg_replace возможно сохранить строку до и после запятой? это сработало, однако я потерял строку до и после

2. например, «Имя пользователя, привет, Оли,; рой, Roy» — это то, с чем я остался сейчас

3. @OliverBS смотрите мой ответ, вам нужно создать две из ваших групп для захвата групп.

4. @SeRPRo что бы я сделал, если бы захотел просто удалить запятую и сохранить строку до и после?

5. @OLIVERS только это: preg_replace(‘/»([a-zA-Z] )(?:, )([ a-zA-Z] )»/’, ’12’, $ yourString, -1, $ count);

Ответ №3:

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

 '/"([a-zA-Z] )(?:, )([a-zA-Z] )"/'
  

Чтобы вы могли повторно использовать захваченные слова вокруг запятой, используя $1 и $2

Смотрите это здесь, в Regexr