Как получить все значения в скобках в строке, включая вложенные скобки?

Вопрос: Желаемое поведение У меня есть проверка ввода, которая, помимо прочего, проверяет длину (< 140 chars). Мой ввод принимает уценку, и я хотел бы исключить длину URL-адресов в моем расчете длины. Например, то, что выглядит как: вот очень длинная ссылка на эту статью на Math.random() длиной 57 символов, тогда как фактический код для него длиной

Вопрос:

Желаемое поведение

У меня есть проверка ввода, которая, помимо прочего, проверяет длину (< 140 chars).

Мой ввод принимает уценку, и я хотел бы исключить длину URL-адресов в моем расчете длины.

Например, то, что выглядит как:

вот очень длинная ссылка на эту статью на Math.random()

длиной 57 символов, тогда как фактический код для него длиной 155 символов, то есть:

here is a very long link to this article on [Math.random()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random)

Сценарии, которые необходимо охватить, – это такие вещи, как:

text and [a markdown link](https://google.com)

text (and [a markdown link within parenthesis](https://google.com))

Этот вопрос о:

Как получить все значения в скобках в строке, включая вложенные скобки.

Что я пробовал

Мой текущий подход к общей проблеме:

  1. получить все значения в скобках в строке
  2. если что-то начинается с https, создайте копию строки
  3. удалить значения из скопированной строки
  4. получить длину скорректированной строки и проверку длины прогона на этом

Это мои попытки в первой части:

01)

Это решение просто получает первое “совпадение”, источник: qaru.site/questions/273614/…

var text = «here is a (very) long link to this article on [Math.random()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random)»; var regExp = /(([^)]+))/; var matches = regExp.exec(text); console.log(matches); // 0: «(very)» // 1: «very»

02)

Это решение получает все совпадения, включая круглые скобки, источник: qaru.site/questions/10246811/…

var text = «here is a (very) long link to this article on [Math.random()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random)»; var regExp = /(?:()[^()]*?(?:))/g; var matches = text.match(regExp); console.log(matches); // 0: «(very)» // 1: «()» // 2: «(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random)»

Но это не работает так, как ожидалось в сценарии с вложенными скобками, то есть:

var text = «text (and [a markdown link within parenthesis](https://google.com))»; var regExp = /(?:()[^()]*?(?:))/g; var matches = text.match(regExp); console.log(matches); // [«(https://google.com)»]

03)

Здесь есть php решение для регулярных выражений, которое, похоже, связано:

qaru.site/questions/3766159/…

но я не мог понять, как реализовать это регулярное выражение в JavaScript, то есть:

preg_match_all(‘/^\((.*)\)[ \t]+\((.*)\)$/’, $s, $matches); Лучший ответ:

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

/[([^]]+)]([^)]+)/g

Обязательно используйте флаг g. Это также включает группу захвата, так что вы можете отличить “видимую” часть (между квадратными скобками) от остальной части, которая является “невидимой”:

var text = «here is a (very) long link to this article on [Math.random()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random)»; var regExp = /[([^]]+)]([^)]+)/g; var match; while (match = regExp.exec(text)) { console.log(«full match: » + match[0]); console.log(«keep: » + match[1]); }

Вы можете использовать вызов replace чтобы удалить “невидимую” часть. Это позволяет легко рассчитать общее количество видимых символов:

var text = «here is a (very) long link to this article on [Math.random()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random)»; var regExp = /[([^]]+)]([^)]+)/g; console.log(«original length: » + text.length); console.log(«visible length: » + text.replace(regExp, «$1»).length);Ответ №1

Попробуйте (?<=()[^()]+(?=))

Объяснение:

(?<=() – с положительным взглядом утверждать, что предшествует (

[^()]+ – соответствует одному или нескольким любым символам, кроме ( и )

(?=)) – с положительным взглядом утверждаю, что следует )

демонстрация

Оцените статью
Добавить комментарий