【发布时间】:2011-01-05 02:19:20
【问题描述】:
我想在我的 Ruby on Rails 字符串中打断一个长单词(类似于 HTML 中的 <wbr>)。
是否可以告诉 Ruby 在字符串 y 的每个 z 字符中添加字符 x?
【问题讨论】:
标签: ruby regex string character
我想在我的 Ruby on Rails 字符串中打断一个长单词(类似于 HTML 中的 <wbr>)。
是否可以告诉 Ruby 在字符串 y 的每个 z 字符中添加字符 x?
【问题讨论】:
标签: ruby regex string character
试试
result = subject.gsub(/(.{10})/m, '\1XX')
用你想要的数字替换10,用你想要的替换字符串替换XX
【讨论】:
在 Perl 中,它将位于 s/(\w{42})/$1\n/g 的某处
【讨论】:
我不熟悉 Rails,但在纯 Ruby 中,您始终可以编写自己的。不知道你为这样的事情放弃了多少速度。
def addcharacter(num, char, string)
x = 0
resultstring = ""
string.each_byte do |byte|
resultstring << byte.chr
x += 1
if x == num
resultstring << char
x = 0
end
end
return resultstring
end
mystring = "hello there"
a = addcharacter(2,"*",mystring)
puts a
【讨论】:
each_byte 处理类似的事情。它仅在字符为字节(即 ASCII)时才有效。 UTF-* 编码的字符串会出现奇怪的行为。
如果您的原始字符串是 str = "0123456789abcde" 并且您想要:
01234XXX56789XXXabcdeXXX:: 使用str.gsub(/.{5}/, '\&XXX')
01234XXX56789XXXabcde :: 使用str.scan(/.{5}/).join('XXX')
这些会为str = "012345678abcdef" 产生略微不同的输入
01234XXX56789XXXabcdeXXXf:: 来自str.gsub(/.{5}/, '\&XXX')
01234XXX56789XXXabcde:: 来自str.scan(/.{5}/).join('XXX')
01234XXX56789XXXabcdeXXXfXXX:: 来自str.gsub(/.{1,5}/, '\&XXX')
01234XXX56789XXXabcdeXXXf :: 来自str.scan(/.{1,5}/).join('XXX')
【讨论】:
可以使用没有反向引用的正则表达式。
让我们将 'XX' 添加到 'My dog has fleas' 每个 n = 3 个字符:
'My dog has fleas'.gsub(/.{#{n}}\K/, 'XX')
#=> "My XXdogXX haXXs fXXleaXXs"
正则表达式读取,“匹配 n 个字符,然后 (\K) 丢弃所有以前的匹配并将正则表达式的字符串指针重置为当前位置(就在这 n 个字符之后和下一个字符之前)”。
对于给定的示例,字符串指针最初位于字符串的开头。 .{3} 匹配字符串的前三个字符 'My '。 \K 丢弃匹配项并将字符串指针重置为第三个和第四个字符' ' 和'd' 之间的(零宽度)位置。 gsub 将零宽度匹配替换为 'XX' 并且字符串指针保留在 'd' 之前。下一个匹配是'dog',\K 丢弃匹配并重置字符串指针,即'g' 和' ' 之间的零宽度位置,替换为'XX' 等等。
【讨论】: