I have such string ('[Test.A[0]]' <>'' OR '[Test.B[0]]' <>'' OR '[Test.C[0]]' <>'' OR '[Test.D[0]]' <> '')
, I want to use regex to get the items below:
- Test.A[0]
- Test.B[0]
- Test.C[0]
- Test.D[0]
I tried like \[.*?\]
, but it will return with [Test.EVAPCT[0]
.
CodePudding user response:
You can use
\w (?:\.\w )*\[[^\][]*]
\w (?:\.\w )*\[\d ]
See the regex demo. Details:
\w
- one or more word chars(?:\.\w )*
- zero or more sequences of a.
and one or more word chars\[
- a[
char[^\][]*
- zero or more chars other than[
and]
/\d
- one or more digits]
- a]
char.
See a demo below:
const text = "('[Test.A[0]]' <>'' OR '[Test.B[0]]' <>'' OR '[Test.C[0]]' <>'' OR '[Test.D[0]]' <> '')";
const regex = /\w (?:\.\w )*\[[^\][]*]/g;
console.log( text.match(regex) );
To also cater for cases like [Test.F]
you may use a regex following a bit different logic:
/(?<=\[)\w (?:\.\w )*(?:\[[^\][]*])?(?=])/g
See this regex demo and the demo below:
const text = "('[Test.A[0]]' <>'' OR '[Test.B[0]]' <>'' OR '[Test.C[0]]' <>'' OR '[Test.D[0]]' <> '') [Test.F]";
const regex = /(?<=\[)\w (?:\.\w )*(?:\[[^\][]*])?(?=])/g;
console.log( text.match(regex) );
Details:
(?<=\[)
- a location right after a[
char(\w (?:\.\w )*(?:\[[^\][]*])?)
- Group 1: one or more word chars, and then zero or more sequences of.
and one or more word chars, and then an optional occurrence of a[...]
substring(?=])
- a location right before a]
char.
CodePudding user response:
Using \[.*?\]
starts the match with [
and matches till the first occurrence of ]
where .*?
can also match [
and therefore matches too much.
You could match the digits between the square brackets to make it a bit more specific:
[^\][] \[\d \]
The pattern matches
[^\][]
Match any char except the square brackets using a negated character class\[\d \]
Match 1 digits between the square brackets
A bit more broader variant could be matching optional chars other than [
]
or a whitspace char before the square bracket.
[^\s\][()']*\[[^\s\][] \]
The pattern matches:
[^\s\][()']*
Optionally match chars other than the listed in the character class\[
Match[
[^\s\][]
Match 1 chars other than[
]
or a whitespace char\]
Match the closing]
const str = `('[Test.F]' <>'' OR '[Test.A[0]]' <>'' OR '[Test.B[0]]' <>'' OR '[Test.C[0]]' <>'' OR '[Test.D[0]]' <> '')`;
const regex = /[^\s\][()']*\[[^\s\][] \]/g;
console.log(str.match(regex));
Matching Test.F
instead of [Test.F]
using a capture group:
\[([^\][]*(?:\[[^\][]*])?)]
const str = `('[Test.A[0]]' <>'' OR '[Test.B[0]]' <>'' OR '[Test.C[0]]' <>'' OR '[Test.D[0]]' <> '') [Test.F]`;
const regex = /\[([^\][]*(?:\[[^\][]*])?)]/g;
console.log(Array.from(str.matchAll(regex), m => m[1]));