在替换之前处理正则表达式匹配

时间:2011-01-12 14:46:01

标签: regex language-agnostic pattern-matching transform

我正在寻找应用程序和编程语言构造来搜索正则表达式模式,以某种方式转换匹配然后替换它。一个非常简单的例子:将“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 个答案:

答案 0 :(得分:1)

我认为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变量,它保存最近读取的行。

答案 1 :(得分:1)

Perl:

$str =~ s/([A-Z])/'_'.lc$1/eg;

答案 2 :(得分:0)

由于我希望在尽可能多的编程语言中回答这个问题,这里是 JavaScript 解决方案:

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

有关功能参数的详细信息,请参阅documentation from MDC。您将获得子匹配和匹配偏移量作为附加参数。


以下是 Python 解决方案:

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