Reputation: 3849
I'm trying to match a set of text inside a bracketed item as a match group.
That text may or may not itself have a bracket in it. To complicate matters, the text may or may not have quotes around it or exist at all, here are some examples of expected output:
[quote=John]abc[/quote] // John
[quote="John"]abc[/quote] // "John"
[quote='John']abc[/quote] // 'John'
[quote='Joh]n']abc[/quote] // 'Joh]n'
[quote='Joh[]n']abc[/quote] // 'Joh[]n'
[quote]abc[/quote] // match
The pattern I've come up with so far is \[quote[=]?["]?([\s\S]*?)["]?\]|\[\/quote\]
but it is failing with the 4-5 examples above because it is seeing the first closing bracket
This would be used in dart
EDIT: The text in the middle abc
should not be part of the match, meaning Match #1 should be [quote...]
and match #2 should be [/quote]
, as my current regex pattern does
Upvotes: 0
Views: 115
Reputation: 784938
You may use this regex:
\[quote(?:=(.+?))?][^\]\[]*\[/quote]
RegEx Breakdown:
\[quote
: Match [quote
(?:
: Start non-capture group
=
: Match a =
(.+?)
: Match 1+ of any character and capture in group #1)?
: End non-capture group. ?
makes this optional match]
: Match closing ]
[^\]\[]*
: Match 0 or more of any character that is not [
and ]
\[/quote]
: Match [/quote]
If you want to have 2 matches per line for opening and closing tags then you can use:
\[quote(?:=(.+?))?](?=[^\]\[]*\[)|\[/quote]
Upvotes: 2
Reputation: 42
Try this one. Seems like working:
\[quote(?:=|=\s*(['"]))?([^\]]*)\1?\]([^\[]*)\[\/quote\]
Upvotes: 2
Reputation: 1987
(?<=quote=)["'a-zA-Z\[\]]+(?=]abc)|(?<=quote])(?=abc)
Where:
(?<=quote=)
- everything that goes after quote=
, look-behind(?=]abc)
- everything that goes before ]abc
, look-ahead["'a-zA-Z\[\]]+
- which symbols are allowed between parts 1 and 2.(?<=quote])
- everything that goes after quote]
, look-behind(?=abc)
- everything that goes before =abc
, look-aheadUpvotes: 1