我有几个条件存储在变量$ conditions下的字符串中。字符串看起来像这样
"s(job_name1) or s(job_name2) or s(job_name3) and s(job_name4)"
我想做的只是获取每个工作名称并将其在一个临时变量中疼痛。现在我有以下内容,但我的直觉表明这不起作用。
@temp = split(/(s()\ orand)/, $conditions)
关于如何做到这一点的任何想法?
答案 0 :(得分:2)
这很简单:
my @names = $conditions =~ /s\(([^)]*)\)/g;
这个简单的解决方案假设带括号的文本不能包含更多的括号,并且没有可能像转义一样。
编辑:意图包括相同正则表达式的扩展版本,这可能会使事情更清晰:
my @names = $conditions =~ m{
s \( # match a literal s and opening parenthesis
( # then capture in a group
[^)]* # a sequence a zero or more
# non-right-parenthesis characters
)
\) # followed by a literal closing parenthesis
}gx; # and return all of the groups that matched
答案 1 :(得分:0)
my @jobnames;
while($conditions =~ m/s\(([^)]*)\)/g) {
push @jobnames, $1;
}
答案 2 :(得分:0)
您可能需要做两件事:
and
或or
s()
位以下是使用split
然后map
执行此操作的一种方法:
@temp = map({/s\(([^)]+)\)/} split(/\s+(?:and|or)\s+/, $conditions));
或稍微清楚一点:
# Break apart on "and" or "or"
@parts = split(/\s+(?:and|or)\s+/, $conditions);
# Remove the s() bit
@temp = map({/s\(([^)]+)\)/} @parts);
答案 3 :(得分:0)
假设没有嵌套的括号。
$_ = 's(job_name1) or s(job_name2) or s(job_name3) and s(job_name4)';
my @jobs = /\((.+?)\)/g;
print "@jobs\n";