Regex.union与多行字符串不匹配

时间:2016-01-06 15:04:06

标签: ruby regex

我想要匹配这些内容:

aws_configuration_file_regex = Regexp.union [
  /aws_access_key_id\s*=\s*(?<aws_access_key_id>.+)/,
  /aws_secret_access_key\s*=\s*(?<aws_secret_access_key>.+)/
]

反对这个联盟:

  => #<MatchData
  "aws_secret_access_key =   69bbTs4LcLIRC5zEQxNxEF6FQJI92pdPJe8HHhoEzDnmtS6I"
     aws_secret_access_key:"69bbTs4LcLIRC5zEQxNxEF6FQJI92pdPJe8HHhoEzDnmtS6I"
aws_access_key_id:nil>

但是它不能正常工作,只有结果中出现的第一个匹配:

import org.apache.jackrabbit.api.security.user.UserManager;

def resourceResolverFactory = getService("org.apache.sling.api.resource.ResourceResolverFactory")
def resourceResolver = resourceResolverFactory.getAdministrativeResourceResolver(null);
UserManager userManager = resourceResolver.adaptTo(UserManager.class);

def authorizable= userManager.getAuthorizable("everyone");

如何解决这个问题?我想保持代码尽可能短,即不应该存在函数定义。

2 个答案:

答案 0 :(得分:0)

问题在于Regexp.union实际上意味着匹配一个另一个。最好先匹配一个,然后匹配另一个。

<小时/> 如果你仍然希望一次性匹配(因为我看到你有不同的命名组,你必须连接它们并添加一个多行标志:

# note the .*? for concatenation and the //m flag
r = /aws_secret_access_key\s*=\s*(?<aws_secret_access_key>.+).*?aws_access_key_id\s*=\s*(?<aws_access_key_id>.+)/m

foo.match(r) # =>
  # #<MatchData
  # "aws_secret_access_key = 69bbTs4LcLIRC5zEQxNxEF6FQJI92pdPJe8HHhoEzDnmtS6I\n  aws_access_key_id = K3YD33nX3u3jeTHWaSnpUw3S66SHpD5cSF"
  # aws_secret_access_key:"69bbTs4LcLIRC5zEQxNxEF6FQJI92pdPJe8HHhoEzDnmtS6I\n  "
  # aws_access_key_id:"K3YD33nX3u3jeTHWaSnpUw3S66SHpD5cSF">

但请注意,这不是单词中最全面的代码。

答案 1 :(得分:0)

你想做这样的事情:

((aws_access_key_id\s*=\s*(?<aws_access_key_id>.+))|(aws_secret_access_key\s*=\s*(?<aws_secret_access_key>.+)))*

似乎可以使用http://rubular.com/

这将收集所有密钥,并进行一系列匹配,因此您必须对其进行排序。强烈建议您尝试使用rubular.com,了解正在发生的事情,甚至调整模式。