Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Regex替换/abcdef/abcdef到/abcdef_Ruby_Regex - Fatal编程技术网

Ruby Regex替换/abcdef/abcdef到/abcdef

Ruby Regex替换/abcdef/abcdef到/abcdef,ruby,regex,Ruby,Regex,通过比较变量str中的值来替换与变量路径的起始值不匹配的路由 path = '/qqqq/rrrr' str = %w|abcd efgh ijkl mnop \n| path.gsub(/\w+/) { |rep| str.include?(rep) ? rep : 'unknown' } 输入>路径=/abcd输出>/abcd 输入>路径=/efgh输出>/efgh 输入>路径=/abcd/efgh输出>/unknown 输入>路径=/xxxx输出>/unknown 输入>路径=/xxxx

通过比较变量str中的值来替换与变量路径的起始值不匹配的路由

path = '/qqqq/rrrr'
str = %w|abcd efgh ijkl mnop \n|
path.gsub(/\w+/) { |rep| str.include?(rep) ? rep : 'unknown' }
输入>路径=/abcd输出>/abcd

输入>路径=/efgh输出>/efgh

输入>路径=/abcd/efgh输出>/unknown

输入>路径=/xxxx输出>/unknown

输入>路径=/xxxx/yyyy输出>/unknown

输入>路径=/xxxx/abcd输出>/unknown


在正则表达式中包含是否有等效项?

使用gsub!我们应该这样做:

path.
  gsub(/\w+/) { |rep| str.include?(rep) ? rep : 'unknown' }.
  sub!("/unknown", "")

如果任何路径与其中一个选项不完全匹配,则应转换:

result = subject.gsub(
    /\A                     # Match from the start of the string
    (?!                     # Assert that this doesn't match:
     \/                     # a slash
     (abcd|efgh|ijkl|mnop)  # followed by one of the allowed paths
     \z                     # that makes up the entire string
    )                       # (End of lookahead assertion)
    .*                      # Match anything/x, '/unknown')
但是你不需要正则表达式

str = %w|abcd efgh ijkl mnop|
paths = %w|/abcd /efgh /abcd/efgh /xxxx /xxxx/yyyy /xxxx/abcd|
paths.map { |path| path[%r|\A/(?:#{Regexp.union(str)})/?\z|] || '/unknown' }
#⇒ ["/abcd", "/efgh", "/unknown", "/unknown", "/unknown", "/unknown"]

Regexp是:
\A
表示字符串的开头,后跟一个斜杠,后跟一个构建为可能性并集的正则表达式,后跟一个斜杠,后跟字符串的结尾。

为了澄清这一点,您需要删除路径中未在
str
中找到的所有部分,您还想将多个后续匹配压缩为一个?所以
/abdc/qqqq/rrrrr/efgh/ssss
将变成
/abdc/unknown/efgh/unknown
?请定义“路由”。你确定你不是指
sub
而不是
gsub
?而且,
str
不是数组的最佳名称。;-)路径任何部分中不匹配的str值应将结果压缩为/unknown。输入:/abdc/qqq/rrrrr/efgh/ssss输出:/unknown您所说的开始是什么意思?似乎任何位置的未知字符串都在触发匹配?输入:/abdc/qqqq/rrrrr/efgh/ssss输出:/unknown输入:/sdfgfg/adcd/efegh输出:/unknown输入:/bacd/efgh输出:/unknown输入:/bacd输出:/efgh输出:/efghpath应与其中一个选项完全匹配。如果不匹配,则转换为“/未知”。有关更多信息,请参见编辑后的问题。这就是正则表达式的作用。您是否测试过它,但它没有按预期工作?您没有使用
gsub您自己答案中的任意位置。命名方法错误:未定义“/abcd”的方法“map”:StringNo way。你在什么地方出错了。上面的代码非常有效。路径是复数。我没有转换任何内容,但您可能希望至少阅读我提供的答案中的代码。当我使用路径时,您的代码可以工作。但我的路径值不同。路径=“/abcd”不是%w |/abcd |。这是导致问题映射的原因。当您要根据需要更新我的代码时,将字符串转换为%w的任何解决方法。这不是一项免费为您编写代码的服务,我完全不在乎您的特殊需要。我已经提供了一个答案,对未来的游客来说可能很有价值。