Project1
标题:
关于正规表达式向后引用的问题
[打印本页]
作者:
SailCat
时间:
2017-12-23 12:20
标题:
关于正规表达式向后引用的问题
代码1的执行结果正常
[pre lang="ruby"]replace_pattern1 = /\\c(\d+)\[(.*?)\]/i
replace_pattern2 = /\\d(\d+)\[(.*?)\]/i
text.gsub!(replace_pattern1) {"\\c[#$1]#$2\\c[0]"}
text.gsub!(replace_pattern2) {"\\c[#$1]\\d[#$2]\\c[0]"}[/pre]
代码2的执行结果不正常
[pre lang="ruby"]replace_patterns = {
/\\c(\d+)\[(.*?)\]/i => "\\c[#$1]#$2\\c[0]",
/\\d(\d+)\[(.*?)\]/i => "\\c[#$1]\\d[#$2]\\c[0]"
}
replace_patterns.each {|k, v| text.gsub!(k) {v}}[/pre]
是因为向后引用不能放在循环里吗?
作者:
IamI
时间:
2017-12-23 20:58
字面值将于执行时被立即决定值。
当 replace_pattern 被结算时,其中的字符串内容被当即确定。
要延迟决定它的值,可以将它放在块(Proc)中。
比如:
replace_patterns = {
/your_exp/ => Proc.new { |args| "value" }
}
replace_patterns.each {|k, v| text.gsub! k, &v }
复制代码
我有点不敢相信……
作者:
taroxd
时间:
2017-12-23 21:07
除楼上的方法外,还可以用字符串作为 gsub 的第二个参数,用 \1 \2 指代被匹配的内容(具体的见文档),可以避开这个问题
作者:
RyanBern
时间:
2017-12-23 21:21
本帖最后由 RyanBern 于 2017-12-23 21:23 编辑
1. 请选择正确的版块提问(x
2. 请善用搜索功能(x
https://rpg.blue/forum.php?mod=viewthread&tid=388535
作者:
summer92
时间:
2017-12-23 23:25
俺基本看不懂啊,我只用基本的 loop end
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X5.0