Регулярное выражение: сопоставление заданного символа c в контексте - PullRequest
0 голосов
/ 20 марта 2020

Вот тестовая строка:

    something { some words };

Мне нужно сопоставить все пробелы (чтобы позже удалить, ie., Заменить их пустым символом с помощью функции "str.replace ()") ) между символами '{' и '}', в javascript. В этом примере я должен сопоставить 3 пробела (один перед «некоторыми», один между «некоторыми» и «словами», один после «слов»). Я рассмотрел несколько похожих вопросов, а также группы предпросмотра и просмотра сзади, но я не могу выяснить, как это сделать.

Можете ли вы мне помочь?

Пока я могу сопоставить только первый пробел: https://regex101.com/r/2KW646/2

Edit: я использую браузер, который поддерживает lookahead и lookbehind.

После того, как я удалю соответствующие пробелы, вывод должен быть:

    something {somewords};

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Вы можете сделать это без regex:

const Fn = s => {
  let r = '', skip_space;
  for (let c of s) {
    if (c === '{') skip_space = !0;
    else if (c === '}') skip_space = !1;
    if (c !== ' ' || !skip_space) r += c;
  }
  return r;
}

console.log(Fn('something { some words };'))

Или просто replace:

const Fn = s => s.replace(
  /([^{]+)({[^}]+})/, 
  (_, m1, m2) => m1 + m2.replace(/\s+/g, '')
);

console.log(Fn('something { some words };'))
0 голосов
/ 20 марта 2020

function myFunction() {
  var str = document.getElementById("demo").innerHTML;
  var left = str.replace(/(.*?{)(.*?)(};)/, "$1");
  var mid =  str.replace(/(.*?{)(.*?)(};)/, "$2");
  var right = str.replace(/(.*?{)(.*?)(};)/, "$3");
  var midnospace = mid.split(" ").join("");
  var result = left + midnospace + right;
  document.getElementById("demo").innerHTML = result;
}
<!DOCTYPE html>
<html>
<body>
<p id="demo">something { some words };</p>
<button onclick="myFunction()">Try it</button>

</body>
</html>

Несколько полезных постов:

Объяснение:

1) Разделить строку на 3 группы захвата. Используйте string replace для хранения только указанных c номеров групп захвата. Одно и то же регулярное выражение используется 3 раза, и .*? делает регулярное выражение «не жадным», поэтому оно не перерасширяется.

a - до / включая {

b - внутри {}

c -} и после.

2) разделить результат из 1b) для пробелов, создание списка строк, которые вы снова объединяете вместе с пустой строкой, чтобы избавиться от пробелов

3) рекомбинировать 1a), 2 и 1 c, чтобы получить желаемый ответ .

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