正则表达式混淆重复子字符串的子字符串

时间:2017-07-06 04:57:46

标签: ruby regex

给出一个字符串:

abc_1234 xyz def_123aa4a56

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

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

规则是:

  1. abc_def_是一种分隔符,因此两者之间的任何内容都是前一个分隔符字符串的一部分。
  2. abc_def_之间的字符串以及下一个分隔的字符串应替换为*,但该子字符串的最后2个字符除外。在上面的示例中,abc_1234 xyz (注释尾随空格)变为abc_*******z

3 个答案:

答案 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"