Обрезать строку, используя соответствие reqex - PullRequest
3 голосов
/ 05 марта 2010

Я должен использовать поврежденный инструмент, который не предоставляет никакого способа обрезать начальные конечные пробелы из строки. У него есть регулярное выражение в стиле .NET, но реализовано только сопоставление, а не замена. Итак, я придумал (на удивление сам) это регулярное выражение, которое, кажется, работает ... но Я не совсем понимаю, почему оно работает : -)

$trimmed = regex/[^ ].*[^ ]/ ($original_string)

Почему это работает, действительно ли это работает во всех случаях, и есть ли лучший способ, если у вас есть только совпадение с регулярным выражением (даже групповые совпадения не могут быть получены :()?

Ответы [ 2 ]

3 голосов
/ 05 марта 2010

Должно работать нормально, если только один символ не окружен пробелом.

Ваш шаблон ищет:

  1. Символ без пробела [^ ]
  2. Ноль или более символов любого вида, как можно больше (жадное совпадение) .*
  3. символ без пробела [^ ]

Итак, если нет хотя бы двух непробельных символов (1 и 3), шаблон не будет совпадать вообще.

Вы должны использовать \b вместо [^ ], который будет соответствовать любой «границе слова», но будет иметь нулевую длину и не потребует двух непробельных символов:

\b.*\b
2 голосов
/ 05 марта 2010

Это работает так: [^ ] будет соответствовать первому непробельному символу, .* будет соответствовать чему угодно, а [^ ] снова будет соответствовать непробельному символу.Поскольку регулярное выражение является жадным, возвращается самое длинное возможное совпадение, поэтому в этом случае самая длинная возможная строка с двумя непробелами на концах эффективно обрезает пробелы в начале и конце $original_string.

Хороший учебникРегулярное выражение здесь , оно учит вас жадному и ленивому сопоставлению, которое является ключом к пониманию и оптимизации регулярных выражений.Он также учит вас совпадению между символами, и это то, что вы хотели бы сделать здесь (см. Ответ о \ b Мартина).

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