Обработка совпадений регулярных выражений перед заменой - PullRequest
0 голосов
/ 12 января 2011

Я ищу приложения и конструкции языка программирования для поиска шаблона регулярного выражения, каким-то образом преобразовать совпадение и затем заменить его.Очень простой пример: преобразование myCamelCasedString в my_camel_cased_string.

В Ruby это просто и лаконично:

 s = "myCamelCasedString".gsub(/[A-Z]/) { |m| "_" + m.downcase }

В PHP это длиннее, но также возможно

  preg_replace_callback('/[A-Z]/', 
     // Using PHP 5.3 anonymous function as callback
     function($m) { return "_" . strtolower($m[0]); }, 
    "myCamelCasedString");

Текстовый редактор jEdit также поддерживает это с помощью «фрагмента Beanshell», но мне всегда нужно искать, как это сделать.Итак - как бы я сделал это на других языках и есть ли специальное приложение / редактор, который позволяет мне это делать (вместе с удобным справочником возможных преобразований)?

Ответы [ 3 ]

1 голос
/ 12 января 2011

В Perl:

$str =~ s/([A-Z])/'_'.lc$1/eg;
1 голос
/ 12 января 2011

Я думаю, что Ruby - это специальное приложение, которое вы ищете:

Данные:

some other text
myCamelCasedString
here is yetAnotherCamelCasedString

Скрипт:

$ ruby -pe '$_.gsub!(/[A-Z]/) { |m| "_" + m.downcase }' <input
some other text
my_camel_cased_string
here is yet_another_camel_cased_string

Волшебный соуспереключатель "-p".Он оборачивает код, предоставляемый с ключом "-e", в "while gets (); ...; print $ _ end".'$ _' - это переменная Perlish, которая содержит последнюю прочитанную строку.

0 голосов
/ 14 апреля 2011

Поскольку я хочу, чтобы на этот вопрос ответили как можно больше языков программирования, вот решение JavaScript :

s = "myCamelCasedString".replace(/[A-Z]/g, function(s) { 
  return '_'+s.toLowerCase();
});

См. Документацию от MDC дляподробности о параметрах функции.Вы получаете подспряжения и смещение совпадения в качестве дополнительных параметров.


Вот решение Python :

import re
re.sub(r"[A-Z]", lambda s: "_" + s.group(0).lower(), "myCamelCasedString")
...