Как мне сопоставить соседние пары разделителей в php-совместимых регулярных выражениях Perl? - PullRequest
2 голосов
/ 15 июня 2009

У меня есть строка, которая может содержать несколько разделителей рядом друг с другом, например |||, хотя это может быть любое количество соседних разделителей. Мне нужно заменить любое место «между» соседней парой с конкретным символом. Эти разделители должны совпадать только в том случае, если между разделителем нет символа, даже пробелов.

Заменить:

ABC|||Blah     with     ABC|*|*|Blah

Однако, когда я попробую это, он не "заполнит" пробел между всеми ними. В том же примере выше это только приводит к ABC|*||Blah
Четыре разделителя приводят к ABC|*||*|Blah

Как мне написать шаблон регулярных выражений, который будет делать то, что мне нужно? Я использую preg_replace PHP.

Ответы [ 3 ]

1 голос
/ 15 июня 2009

Ответ, который сработал для меня, оказался положительным.

/\|(?=\|)/

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

1 голос
/ 15 июня 2009

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

(?<=\|)(?=\|)

заменить глобально на

*
0 голосов
/ 15 июня 2009

Почему бы не работать с str_replace:

$str = str_repalce('||', '|*|', str_replace('||', '|*|', $str));

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

  1. в начале: |foo|bar*|foo|bar
  2. посередине: foo||barfoo|*|bar
  3. в конце: foo|bar|foo|bar|*

Последние два могут быть обработаны одновременно, но первый должен обрабатываться отдельно:

$str = preg_replace('/^\|/', '*|', preg_replace('/\|(?=\||$)/', '|*', $str))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...