正则表达式 - 正则分组匹配时,使用’\n ‘与 $n 为什么不同?
ringa_lee
ringa_lee 2017-04-24 15:59:42
0
3
983

例如:要将第一分组大写:
str = '1abc2aabbcc3aaabbbccc4'
pp str.sub(/(a{2})(b{2})/, '\1.upcase\2') # =>"1abc2aa.upcasebbcc3aaabbbccc4" 第一分组怎么没有变大写呢?
pp str.sub(/(a{2})(b{2})/, '\1'.upcase + '\2') # =>"1abc2aabbcc3aaabbbccc4" 奇怪,upcase()还是没起作用!?
pp str.sub(/(a{2})(b{2})/, $1.upcase + '\2') # =>"1abc2AAbbcc3aaabbbccc4" 使用$1而不是'\1',upcase()才起作用?

ringa_lee
ringa_lee

ringa_lee

全部回复(3)
我想大声告诉你

这里涉及两个问题:
1, '1', 两种反向引用的区别
2, Ruby中单引号'和双引号"$1, 两种反向引用的区别

2, Ruby中单引号'和双引号"的细微区别

'1'而不是1, 因为Ruby作为通用语言, 是不存在1这种对象的. 换句话说, 你是不能单独写1你可能注意到, 我写的是

.

问题1:

'1'用在匹配内, 用在匹配外. 本质是全局变量, 只要发生正则匹配, Ruby就会更新这些全局变量. 此处主要是参考Perl的正则设计. '1'

本质是字串, 只是在匹配时, 用于组的反向引用.

1的确是正规的正则反向引用, 如在sed中使用, echo str | sed -E 's,(a{2})(b{2}),21,g'但在广义上,

.

str =~ /(a{2})(b{2})/
  #=> 'aa'
str =~ /(a)(b)/
  #=> 'a'
str.sub(/(a{2})(b{2})/, '')  #=> 1abc2bbaacc3aaabbbccc4
'1'表示匹配的第一组, 即a, 意思是重复两个a说明: .

'1'但一个特殊处, 在执行替换时, 也可以使用

.

问题2:

'"用法相同, 但在处理时有区别. 双引号的"1"是表示"u0001", 也就是说, 用来键入unicode字符, 是一个字符. 而单引号的'1', 就是1, 是两个字符, 如前述, 其本质是字符串, 当执行'1'.upcase时, 是对两个字符执行大写, 但Ruby中, 非小写字符的#upcase大部分情况下, '"用法相同, 但在处理时有区别. 双引号的"1"是表示"u0001", 也就是说, 用来键入unicode字符, 是一个字符. 而单引号的

, 就是1, 是两个字符, 如前述, 其本质是字符串, 当执行'1'.upcase时, 是对两个字符执行大写, 但Ruby中, 非小写字符的#upcase方法返回本身.

'1'替换为aa, 再执行#upcase方法, 再替换原字串. 就我目前知道, 做不到这点, 除非ruby在语言层面提供新的语法, 否则, '1'就只是一个字串, 它对匹配组的引用并不是变量存储的过程, 猜测可能是, 在底层执行的过程, 会自动将'..'中的1考虑你这里的意思, 应该是先将

替换为aa, 再执行#upcase方法, 再替换原字串. 就我目前知道, 做不到这点, 除非ruby在语言层面提供新的语法, 否则,

就只是一个字串, 它对匹配组的引用并不是变量存储的过程, 猜测可能是, 在底层执行的过程, 会自动将'..'中的1替换为引用的字串.

    解答:
  • '1.upcase2', 单引号中的'1''1'分别被替换为aabb, .upcase

    '1.upcase2', 单引号中的
  • 分别被替换为aabb, .upcase不变.

    '1'.upcase'1', 再与'2'

  • '1'.upcase
  • , 再与'2'连接

    .upcase, 变量存储字串'aa'

, 再大写🎜🎜 🎜
左手右手慢动作

尝试“1”

Peter_Zhu

参数传入方法时,是先计算参数,再把结果传入方法的

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!