RegEx直接在关键字之前和之后匹配字符

时间:2015-04-26 14:57:56

标签: regex string perl match

我对RegEx还不够好。我一直在四处寻找并试图写自己的,并且没有成功。我想搜索字符串

Shelf-15-Contains(Item)10-Depo91

我想搜索(),可以通过

来搜索
/\(([^()]+)\)/g

当RegEx发现()时,我想抓住这些东西'在(),()和内部的所有内容之前,然后直接跟随之后的内容。所以,

Contains(Item)10

编辑:此外,我上面的RegEx确保没有嵌套(),所以一旦我弄清楚如何匹配之前和之后的内容我应该能够递归地运行这个如果有多个嵌套图层?

3 个答案:

答案 0 :(得分:1)

怎么样:

/([^-]+\([^()]+\)[^-]+)/g

答案 1 :(得分:1)

对于之前和之后的匹配,请使用其他捕获组:

while (
  $str
  =~ m/
        ([^-]*)          # before
        \( ( [^()]* ) \) # (in)
        (?= ([^-]*) )    # after
     /gx
) {
    my ($before, $in, $after) = ($1, $2, $3);
    ...
}

严格意义上的正则表达式无法识别嵌套构造(有限状态机接受字符串)。 Perl的正则表达式引擎为识别平衡括号提供了额外的结构,但它们很难使用。

http://perldoc.perl.org/perlre.html#Extended-Patterns提供了如何在(??{ code })(?PARNO)解析平衡括号的示例。

最后,您要解析的字符串的结构似乎是一个- - 分隔列表。尝试为你要解析的内容找到一个正式的语法,它将帮助你设计你的程序。

如果您不需要处理a(b)c(d)e,则可以将(?= ([^-]*) )简化为([^-]*)

答案 2 :(得分:0)

恕我直言,这里不需要过于复杂。这是一个匹配Contains的正则表达式,括号中的所有内容(带或不带嵌套的,平衡或不平衡)和可选数字。它假设这个结构有-个:

\w+\(.*?\)\d*(?=-|$)

请参阅demo

输入:

Shelf-15-Contains(I(t)e(m))10-Depo91
Shelf-15-Contains(I(t)e(m))-Depo91

匹配

Contains(I(t)e(m))10
Contains(I(t)e(m))