我想要匹配这些内容:
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");
如何解决这个问题?我想保持代码尽可能短,即不应该存在函数定义。
答案 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,了解正在发生的事情,甚至调整模式。