用正则表达式和捕获替换

时间:2016-05-08 16:25:33

标签: ruby regex

以下方法应将"CamelCase"转换为def zebulansNightmare(string) string.gsub(/_(.)/){$1.upcase} end

"camel_case"

使用字符串gsub(/_(.)/),我希望c_之后的$1匹配。我知道_是第一个匹配的字母:大写字母。但它的工作原理就是用_代替大写字母。为什么private void setAlarm(Calendar targetCal,Boolean iscancel) { Intent intent = new Intent(getBaseContext(), AlarmReceiver.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), RQS_1, intent, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); if (iscancel==true) { alarmManager.cancel(pendingIntent); } else { alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), pendingIntent); } } 消失了?

2 个答案:

答案 0 :(得分:2)

你是$1是捕获的值,但gsub与之前的_匹配,并且整个匹配被替换。您需要将_重新插入结果:

"camel_case".gsub(/_(.)/){"_#{$1.upcase}"}

请参阅IDEONE demo

顺便说一句,如果你只打算匹配_后跟一个字母(为了不浪费时间和资源试图将非字母变为大写),你可以使用以下正则表达式:

/_(\p{Ll})/

其中\p{Ll}是任何小写的Unicode字母。

答案 1 :(得分:1)

def zebulans_nightmare(string)
  string.gsub(/\B_[a-z0-9]/) { |s| s[1].upcase }
end

zebulans_nightmare("case_of_snakes")
  #=> "caseOfSnakes" 
zebulans_nightmare("case_of_3_snakes")
  #=> "caseOf3Snakes" 
zebulans_nightmare("_case_of_3_snakes")
  #=> "_caseOf3Snakes" 

\B matches non-word boundaries