![](/img/trans.png)
[英]Regex only match if character is not included directly before desired string
[英]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.