给出一个字符串:
abc_1234 xyz def_123aa4a56
我想替换它的一部分,所以输出是:
abc_*******z def_*******56
规则是:
abc_
和def_
是一种分隔符,因此两者之间的任何内容都是前一个分隔符字符串的一部分。abc_
和def_
之间的字符串以及下一个分隔的字符串应替换为*
,但该子字符串的最后2个字符除外。在上面的示例中,abc_1234 xyz
(注释尾随空格)变为abc_*******z
答案 0 :(得分:2)
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"
答案 1 :(得分:2)
这是你在找什么?
str = "Hello abc_111def_frg def_333World abc_444"
str.scan(/(?<=abc_|def_)(?:[[:alpha:]]+|[[:digit:]]+)/)
# => ["111", "frg", "333", "444"]
我假设"abc_"
或"def_"
后面的字符串是全部数字或全部字母。例如,如果您希望从"a1b"
中提取"abc_a1b cat"
,则无效。您需要更好地定义终止所需字符串的规则。
正则表达式读取“跟随字符串"abc_"
或"def_"
(不属于匹配的正向外观),匹配一串数字或一串字母”。
答案 2 :(得分:1)
假设:
> s
=> "abc_1234 xyz def_123aa4a56"
你可以这样做:
> s.gsub(/(?<=abc_|def_)(.*?)(..)(?=(?:abc_|def_|$))/) { |m| "*" * $1.length<<$2 }
=> "abc_*******z def_*******56"