繁体   English   中英

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

[英]RegEx to Match Characters Directly Before Keyword and Directly Afterwards

我对RegEx还不够好。 我一直在寻找并尝试编写自己的书,但没有成功。 我想搜索一个字符串

Shelf-15-Contains(Item)10-Depo91

我想搜索(),可以通过

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

当RegEx找到()时,我想获取(),()和里面的所有内容之前的“东西”,然后紧随其后的东西。 所以,

Contains(Item)10

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

怎么样:

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

要进行前后匹配,请使用其他捕获组:

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 ,则可以将(?= ([^-]*) )简化为([^-]*)

恕我直言,这里不需要太复杂。 这是一个正则表达式,它将匹配Contains ,方括号中的所有内容(带或不带嵌套的,平衡的或不平衡的)以及可选数字。 它假定有-解决此建设的影响:

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

观看演示

输入:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM