Как убрать слова из скобок с помощью регулярного выражения

Я хочу вывести слова из скобок с помощью регулярного выражения.

Это мой код:

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

Есть ли способ использовать негативный взгляд вперед?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
79
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ваше регулярное выражение использует отрицательный просмотр вперед (?!.+\), чтобы утверждать, что то, что находится справа, не является закрывающей круглой скобкой. В нем есть совпадения с момента последнего появления закрывающей круглой скобки, потому что после этого больше нет ). Затем вы сопоставляете символы из 1+ слов, которые будут соответствовать you.

Вместо использования отрицательного просмотра вперед вы можете использовать группу захвата:

\([^)]+\)\s*(\w+)

Демо Regex

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]);
}

Танки за ответ, но как использовать отрицательный взгляд вперед?

Ehsan 15.12.2018 11:42

Отрицательный просмотр вперед делает утверждение для следующего, но вы хотите проверить, не находится ли строка, которую вы хотите сопоставить, в круглых скобках слева и справа. Вы можете проверить, является ли то, что справа, закрывающей круглой скобкой, но вы не можете быть уверены, что это или нет слева.

The fourth bird 15.12.2018 11:52

Легкий способ решить эту проблему - 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*/, вам не нужно обрезать результаты ...

Nick 15.12.2018 13:13

Вы можете сделать это так

Сначала удалите все символы между (), а затем разделите их на 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)
)

Первый подход надежен. Второй требует, чтобы все круглые скобки были соединены и правильно закрыты.

Другие вопросы по теме