То, что вы можете изменить, это сопоставить ~
или )
(?<=status~contains~).*?(?=[)~])
Regex demo
Вместо использования lookbehind (который еще не полностью поддерживается в разных браузерах), вы также можете вместо этого использовать группу захвата и убедиться, что есть открывающая и закрывающая скобки.
Значение находится в группе 1.
\((?:[^~\r\n]+~)*status~contains~([^~\n]+)(?=[^()]*\))
\(
Соответствует открытию (
(?:
Группа без захвата [^~\r\n]+~
Совпадение 1+ раз с любым символом, кроме ~
или новой строкой
)*
Закрыть гуп, повторить 0+ раз status~contains~
Совпадение буквально (
Захват группа 1 [^~\n]+
Совпадение 1+ раз с любым символом, кроме ~
или новой строки
)
Закрыть группу (?=[^()]*\))
Положительный взгляд вперед, заявитьзакрытие )
Regex demo
const regex = /\((?:[^~\r\n]+~)*status~contains~([^~\n]+)(?=[^()]*\))/g;
const str = `(username~contains~'ren'~and~status~contains~false)
(status~contains~false~and~username~contains~'ren')`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
console.log(m[1]);
}