Как получить все значения в скобках в строке, включая вложенные скобки? - PullRequest
1 голос
/ 03 июля 2019

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

У меня есть проверка ввода, которая, помимо прочего, проверяет длину (< 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)

Это решение просто получает первый "матч", источник: https://stackoverflow.com/a/12059321

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)

Это решение получает все совпадения, включая круглые скобки, источник: https://stackoverflow.com/a/30674943

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 решение регулярных выражений, которое, похоже, связано:

https://stackoverflow.com/a/12994041

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

preg_match_all('/^\\((.*)\\)[ \\t]+\\((.*)\\)$/', $s, $matches);

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

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

/\[([^\]]+)\]\([^)]+\)/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);
2 голосов
/ 03 июля 2019

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

Пояснение:

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

[^()]+ - соответствует одному или нескольким символам, отличным от ( и )

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

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...