/
jk # match literal
(?! # begin a negative lookahead
.* # match zero or more characters other than line terminators
jk # match literal
) # end negative lookahead
/mx # invoke multiline and free-spacing regex definition modes.
多行模式使.匹配任何字符,包括行结束符。 第二个正则表达式可以写为如下。
\A # match the beginning of the string
(.*) # match zero or more characters other than line terminators
# and save the match to capture group 1
jk # match literal
/mx # invoke multiline and free-spacing regex definition modes.
6条答案
按热度按时间goqiplq21#
String#rindex
返回给定子字符串最后一次出现的索引String#[]=
可以接受两个整数参数,第一个是开始替换的索引,第二个是被替换字符串的长度您可以按以下方式使用它们:
uurv41yg2#
没有美元可能就足够了。
a1o7rhls3#
听起来你只想替换一个特定的后缀,如果是这样,我可能会建议使用
sub
沿着一个锚定正则表达式(只在字符串末尾检查所需的字符):或者,您可以完全不使用正则表达式,使用
reverse!
方法沿着一个简单的条件语句(仅当后缀存在时)来执行sub!
:或者,您甚至可以使用一种完全不同的方法。下面是一个示例,使用
chomp
删除不需要的后缀,然后使用ljust
为修改后的字符串填充所需的后缀。注意,只有当字符串的长度被初始chomp修改时,才会添加新的后缀,否则,字符串保持不变。
e4eetjau4#
如果目标是替换LAST OCCURRENCE(与仅后缀相反),则可以通过将
sub
与reverse
沿着使用来实现:ggazkfy85#
在字符串的末尾用其他东西替换
"jk"
是很简单的,可以不用考虑字符串中可能存在的"jk"
的其他示例,所以我假设这不是要问的问题,而是假设用"sd"
替换字符串中"jk"
的最后一个示例。下面是两个将String#sub与正则表达式结合使用的解决方案。
使用负前瞻
这里的想法是匹配
"jk"
,前提是在字符串后面没有"jk"
的另一个示例。捕获字符串中最后一个
"jk"
之前的部分匹配项(如果存在)由字符串的前面加上最后一个
"jk"
组成,后者将替换为捕获的字符串加上"sd"
。这两个正则表达式可以用 * 自由空格模式 * 来编写,以使它们自文档化。
多行模式使
.
匹配任何字符,包括行结束符。第二个正则表达式可以写为如下。
注意,在两个表达式中,
.*
都是 greedy,这意味着只要满足表达式的其他要求,它将匹配尽可能多的字符,包括"jk"
,这里匹配字符串中"jk"
的最后一个示例。pnwntuvh6#
下面是一个不同的解决方案: