Regular Expression to match outer brackets
I need a regular expression to select all the text between two outer brackets.
Example: some text(text here(possible text)text(possible text(more text)))end text
Result: (text here(possible text)text(possible text(more text)))
I've been trying for hours, mind you my regular expression knowledge isn't what I'd like it to be :-) so any help will be gratefully received.
Regular expressions are the wrong tool for the job because you are dealing with nested structures, ie recursion.
But there is a simple algorithm to do this, which I described in this answer to a previous question.
你可以使用正则表达式递归:
(([^()]|(?R))*)
I want to add this answer for quickreference. Feel free to update.
.NET Regex using balancing groups.
((?>((?<c>)|[^()]+|)(?<-c>))*(?(c)(?!)))
Where c
is used as the depth counter.
Demo at Regexstorm.com
PCRE using a recursive pattern.
((?>[^)(]+|(?R))*)
Demo at regex101; Or without alternation:
((?>[^)(]*(?R)?)*)
Demo at regex101. The pattern is pasted at (?R)
which represents (?0)
.
Perl, PHP, Notepad++, R: perl=TRUE, Python: Regex package with (?V1)
for Perl behaviour.
Ruby using subexpression calls.
With Ruby 2.0 g<0>
can be used to call full pattern.
((?>[^)(]+|g<0>)*)
Demo at Rubular; Ruby 1.9 only supports capturing group recursion:
(((?>[^)(]+|g<1>)*))
Demo at Rubular (atomic grouping since Ruby 1.9.3)
JavaScript API :: XRegExp.matchRecursive
XRegExp.matchRecursive(str, '(', ')', 'g');
JS, Java and other regex flavors without recursion up to 2 levels of nesting:
((?:[^)(]+|((?:[^)(]+|([^)(]*))*))*)
Demo at regex101. Deeper nesting needs to be added to pattern.
To fail faster on unbalanced parenthesis drop the +
quantifier.
Java : An interesting idea using forward references by @jaytea.
Reference - What does this regex mean?
上一篇: 正则表达式匹配最多两位小数的数字
下一篇: 正则表达式匹配外部括号