Извлечение текста, который находится между двумя парами специальных символов - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь извлечь строку из предложения, встроенного в теги HTML <b></b>, также встроенного в круглые скобки ( ) .

Я могу сделать это с помощью следующего кода

const regExp = /\(([^)]+)\)/

// fetches the string within parentheses 
let string = regExp.exec('This is some (<b>super cool</b>) text I have here')
// output = '<b>super cool</b>

// removes the html tags
let string2 = string.replace(/<[^>]*>?/gm, '')
// output = 'super cool'

Проблема в том, что у меня иногда есть предложения с несколькими наборами скобок. Приведенный выше код извлекает только первый экземпляр скобок, и они могут или не могут быть в пределах тегов <b></b> 1016 *

, то есть строка

This is (some) (<b>super cool</b>) text I have (here)

вернет some, используя тот же код выше, но я хочу вернуть super cool

Как мне пройти всю строку, чтобы извлечь только текст, который находится внутри (<b> и </b>)?

РЕДАКТИРОВАТЬ

Я забыл упомянуть (извинения), может быть текст, который находится между закрывающим тегом </b> и закрывающей скобкой ). Например,

This is some (<b>super cool</b> groovy) text I have here

, что добавляет немного сложности (в противном случае я мог бы использовать split() и pop()

Ответы [ 2 ]

3 голосов
/ 13 февраля 2020

Вместо этого вы можете использовать этот regExp: /(?<=\(<b>)(.*?)(?=<\/b>\))/, который будет захватывать все между первыми (<b> и </b>), с которыми вы столкнулись.

Если вы хотите захватить все экземпляры, просто добавьте глобальный флаг /g: /(?<=\(<b>)(.*?)(?=<\/b>\))/g

Также с этим методом вам не нужно будет делать string.replace() впоследствии, сохраняя вам еще одну операцию.

const regExp = /(?<=\(<b>)(.*?)(?=<\/b>\))/
const str = 'This is some (<b>super cool</b>) text I have here'

console.log(str.match(regExp)[0])
// --> super cool

РЕДАКТИРОВАТЬ : После редактирования OP, если какой-либо текст может находиться между закрывающим тегом </b> и закрывающим ), просто измените ваш regExp на: /(?<=\(<b>)(.*?)(?=\))/, который будет захватывать все между первыми (<b> и ), с которыми вы столкнулись.

Но тогда вам также потребуется string.replace('</b>', ''), чтобы удалить закрывающий тег </b>.

const regExp = /(?<=\(<b>)(.*?)(?=\))/
const str = 'This is some (<b>super cool</b> groovy) text I have here'

console.log(str.match(regExp)[0].replace('</b>', ''))
// --> super cool groovy
1 голос
/ 13 февраля 2020

Это работает для меня, попробуй вот так вместо регулярного выражения использовать split

const string = 'This is (some) (<b>super cool</b>) text I have (here)';    
const str    = string.split('<b>').pop().split('</b>')[0];
console.log(str);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...