正则表达式用于对重复子字符串的子字符串进行模糊处理



给定一个字符串,如下所示:

abc_1234 xyz def_123aa4a56

我想替换它的一部分,所以输出是:

abc_*******z def_*******56

规则是:

  1. abc_def_是一种分隔符,因此两者之间的任何内容都是上一个分隔符字符串的一部分。
  2. 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"

最新更新