给定一个字符串,如下所示:
abc_1234 xyz def_123aa4a56
我想替换它的一部分,所以输出是:
abc_*******z def_*******56
规则是:
abc_
和def_
是一种分隔符,因此两者之间的任何内容都是上一个分隔符字符串的一部分。abc_
和def_
之间的字符串以及下一个分隔字符串应替换为*
,除了该子字符串的最后 2 个字符。在上面的例子中,abc_1234 xyz
(注意尾随空格(变成了abc_*******z
prefixes = %w|abc_ def_|
input = "Hello abc_111def_frg def_333World abc_444"
input.gsub(/(#{Regexp.union(prefixes)})../, "\1**")
#⇒ "Hello abc_**1def_**g def_**3World abc_**4"
这是你要找的吗?
str = "Hello abc_111def_frg def_333World abc_444"
str.scan(/(?<=abc_|def_)(?:[[:alpha:]]+|[[:digit:]]+)/)
# => ["111", "frg", "333", "444"]
我假设"abc_"
或"def_"
后面的字符串要么是全数字,要么全是字母。例如,如果您希望从"abc_a1b cat"
中提取"a1b"
,则不起作用。您需要更好地定义终止所需字符串的规则。
正则表达式为"跟随字符串"abc_"
或"def_"
(不是匹配的一部分的正面查看(,匹配一串数字或一串字母"。
给定:
> s
=> "abc_1234 xyz def_123aa4a56"
你可以做:
> s.gsub(/(?<=abc_|def_)(.*?)(..)(?=(?:abc_|def_|$))/) { |m| "*" * $1.length<<$2 }
=> "abc_*******z def_*******56"