Вопрос:
Желаемое поведение
У меня есть проверка ввода, которая, помимо прочего, проверяет длину (< 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))
Этот вопрос о:
Как получить все значения в скобках в строке, включая вложенные скобки.
Что я пробовал
Мой текущий подход к общей проблеме:
- получить все значения в скобках в строке
- если что-то начинается с https, создайте копию строки
- удалить значения из скопированной строки
- получить длину скорректированной строки и проверку длины прогона на этом
Это мои попытки в первой части:
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
Попробуйте (?<=()[^()]+(?=))
Объяснение:
(?<=() – с положительным взглядом утверждать, что предшествует (
[^()]+ – соответствует одному или нескольким любым символам, кроме ( и )
(?=)) – с положительным взглядом утверждаю, что следует )