Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在替换中修改正则表达式匹配项_Ruby_Regex - Fatal编程技术网

Ruby 在替换中修改正则表达式匹配项

Ruby 在替换中修改正则表达式匹配项,ruby,regex,Ruby,Regex,我试图用正则表达式匹配文本文件中的一些字符串,然后修改找到模式的所有位置。这就像一个搜索和替换,但我正试图用一个被发现的东西的修改版本来替换(我确信这个有一个名字,但我对它还不够熟悉) 因此,我正在寻找与[a-z]\uu[a-z]匹配的字符串(例如,some\u string),我想通过删除下划线并大写第二个小写单词来替换它,基本上是驼峰式大小写(someString) 任何关于如何做到这一点的建议(棘手的部分是我真的不知道如何用谷歌来实现这一点) 编辑 我试图将问题简化一点,使其更一般化,但我

我试图用正则表达式匹配文本文件中的一些字符串,然后修改找到模式的所有位置。这就像一个搜索和替换,但我正试图用一个被发现的东西的修改版本来替换(我确信这个有一个名字,但我对它还不够熟悉)

因此,我正在寻找与
[a-z]\uu[a-z]
匹配的字符串(例如,
some\u string
),我想通过删除下划线并大写第二个小写单词来替换它,基本上是驼峰式大小写(
someString

任何关于如何做到这一点的建议(棘手的部分是我真的不知道如何用谷歌来实现这一点)

编辑


我试图将问题简化一点,使其更一般化,但我也试图仅在匹配不以引号出现的情况下这样做。也就是说,我不想在引号中匹配下划线(因此,这里没有匹配:
“这是字符串”
…应该保持原样)。当我第一次发表这篇文章时,我可能应该包括这一点。

您可以对gsub使用回调函数,例如:

"some_thing_good".gsub(/_([a-z])/) {|m| m[1].upcase}
要避免双引号内的字符串,可以执行以下操作:

"\"look_at_me\" some_thing_good".gsub(/"[^"]+"|_[a-z]/) {|m| (m.length>2)? m : m[1].upcase }

这样做的目的是在之前匹配它们,然后自己替换它们。如果我测试匹配长度,我会立即知道替换的哪个部分已匹配,因为第二部分仅包含2个字符,第一部分至少包含3个字符

我认为更好的方法是使用括号括起您感兴趣的模式

在您的情况下,我将使用以下正则表达式:

string.gsub(/(?<=[a-z])_([a-z]+)/) {|s| "#{s[1].upcase}#{s[2..-1]}"}

string.gsub(/(?您想查看后向引用。创建两个或多个正则表达式,它们一起等于第一个正则表达式,然后您可以使用其中一个的后向引用来修改它。@jbrennan我相信使用本机字符串会更容易一些,比如数组words=indexOf('-')。split;words[1]。charAt(1).大写;单词.连接^^^psuedocode@raam86我想了一下,但我有另一个要求,即Underf_分数只有在没有引号的情况下才能匹配,所以正则表达式比我展示的要复杂一些。啊哈,这很有效。所以我在问题中没有提到的是,我还必须排除引号之间的实例.你也知道这样做的好方法吗?@jbrennan你可以先交替匹配它们,然后返回它们,你能详细说明这意味着什么吗?我不确定我是否理解。
string.gsub(/(?<=[a-z])_([a-z]+)/) do |s| 
  p Regexp.last_match.to_a # this will print all sub-patterns found
  "#{s[1].upcase}#{s[2..-1]}" # return formatted string
end
string.scan(/(\"[^\"]+\"|([^\"]+))/) do |s|
  next s[0] unless s[1] # skip quoted data
  # replace snake case to camel case
  s[1].gsub(/(?<=[a-z])_([a-z]+)/) {|s| "#{s[1].upcase}#{s[2..-1]}"}
end