如何从Perl中的较大字符串中获取字符串

时间:2011-04-13 16:45:32

标签: perl string

我有几个条件存储在变量$ conditions下的字符串中。字符串看起来像这样

"s(job_name1) or s(job_name2) or s(job_name3) and s(job_name4)"

我想做的只是获取每个工作名称并将其在一个临时变量中疼痛。现在我有以下内容,但我的直觉表明这不起作用。

@temp = split(/(s()\ orand)/, $conditions)

关于如何做到这一点的任何想法?

4 个答案:

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

您可能需要做两件事:

  • 拆分andor
  • 上的输入
  • 删除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";