Я хочу вывести слова из скобок с помощью регулярного выражения.
Это мой код:
var patt = /(?!.+\))\w+/g;
var str = '( hello ) ehsan (how are) you' ;
console.info( patt.exec(str) ) ;
console.info( patt.exec(str) ) ;Фактический результат
you , null
Ожидаемый результат
ehsan , you
Есть ли способ использовать негативный взгляд вперед?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ваше регулярное выражение использует отрицательный просмотр вперед (?!.+\), чтобы утверждать, что то, что находится справа, не является закрывающей круглой скобкой. В нем есть совпадения с момента последнего появления закрывающей круглой скобки, потому что после этого больше нет ). Затем вы сопоставляете символы из 1+ слов, которые будут соответствовать you.
Вместо использования отрицательного просмотра вперед вы можете использовать группу захвата:
\([^)]+\)\s*(\w+)
const regex = /\([^)]+\)\s*(\w+)/g;
const str = `( hello ) ehsan (how are) you`;
let m;
while ((m = regex.exec(str)) !== null) {
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
console.info(m[1]);
}Если движок поддерживает смотреть за с квантификаторами бесконечной длины, вы также можете использовать положительный просмотр назад:
(?<=\([^()]+\)) (\w+)
const regex = /(?<=\([^()]+\))\s*(\w+)/g;
const str = `( hello ) ehsan (how are) you`;
while ((m = regex.exec(str)) !== null) {
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
console.info(m[1]);
}Отрицательный просмотр вперед делает утверждение для следующего, но вы хотите проверить, не находится ли строка, которую вы хотите сопоставить, в круглых скобках слева и справа. Вы можете проверить, является ли то, что справа, закрывающей круглой скобкой, но вы не можете быть уверены, что это или нет слева.
Легкий способ решить эту проблему - split:
const input = '( hello ) ehsan (how are) you';
const output = input.split(/\(.+?\)/);
console.info(output);
console.info(output.filter(v => v));
console.info(output.filter(v => v).map(v => v.trim()));Если вы измените регулярное выражение на /\s*\(.+?\)\s*/, вам не нужно обрезать результаты ...
Вы можете сделать это так
Сначала удалите все символы между (), а затем разделите их на space.
var str = '( hello ) ehsan (how are) you' ;
let op = str.replace(/\(.*?\)/g, '').trim().split(/\s+/)
console.info(op);Приведенные ниже инструкции дают ожидаемый результат.
var patt = /(?!.+\))\w+/g;
var str = '( hello ) ehsan (how are) you' ;
var arr = str.split(/\([\w\s]*\)/); // [ '', ' ehsan ', ' you' ]
var arr = arr.filter((s) => s!== ""); // [ ' ehsan ', ' you' ]
var s = ("" + arr).trim();
console.info(s); // ehsan , you
У вас есть два варианта. Первым будет сопоставление всего в круглых скобках, а затем любых оставшихся слов. Впоследствии вы можете легко их отфильтровать:
var str = '( hello ) ehsan iran (how are) you';
console.info(
str.match(/\([^()]*\)|\w+/g).filter(x => x[0] !== '(')
)Второй подход - обмануть отрицательный взгляд вперед:
var str = '( hello ) ehsan iran (how are) you';
console.info(
str.match(/\w+(?![^()]*\))/g)
)Первый подход надежен. Второй требует, чтобы все круглые скобки были соединены и правильно закрыты.
Танки за ответ, но как использовать отрицательный взгляд вперед?