【问题标题】:The passing of a string (incl. regex parameters) to a block of code将字符串(包括正则表达式参数)传递给代码块
【发布时间】:2019-08-05 09:50:07
【问题描述】:

长度为4个或以上的字符串需要按以下格式返回:

"#{firstLetter}#{string.length-2}#{lastLetter}"

InputString = 堆栈溢出

预期字符串 = s11w

这是产生正确预期输出的代码。

string.gsub /(\w)(\w+{2})(\w)/ do |word|       
      "#{$1}#{word.length-2}#{$3}"        
end

我有点明白这里发生了什么,但不明白正则表达式与 $1 和 $3 的使用之间的确切关系。有点明白了……但还不足以以我自己的方式使用它来解决新问题。

【问题讨论】:

  • 很简单:$N 表示“比赛中第 N 个捕获组的内容”。它在docs,顺便说一句。
  • 这个正则表达式很奇怪。为什么\w+{2}?它有效,但是...... Weeeird。并且取决于引擎的实现方式,可能效率低下。我会写\w{2,}...
  • 在文档中错过了它。感谢您对我非常愚蠢的问题的帮助。

标签: regex ruby string gsub


【解决方案1】:

在您的正则表达式中,您有 3 个捕获组:\w、\w+{2} 和 \w。当您稍后说$N(其中N 是某个数字)时,您实际上指的是正则表达式中的捕获组。

String#gsub 方法会为您填充这些变量 (Ruby doc)。

【讨论】:

  • 因此 .gsub 根据正则表达式的要求在字符串中查找匹配条件,并将每个匹配项替换为字符串文字中指定的匹配项。对吗?
  • @Rey 在块形式中,gsub 用块的结果替换每个匹配项。
  • @Rey 是的,但不是每个匹配,而是每个捕获组。以下正则表达式不起作用:/\w\w+{2}\w/.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多