Заменить строку между первым и вторым вхождением косой черты - PullRequest
0 голосов
/ 28 мая 2020

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

Пример

const str = '/questions/ask/1'
const strReplace = str.replace(/\[.*?\]\s?/g, 'example')

Вывод:

  1. /questions/ask/1 до /example/ask/1
  2. /questions-math/ask/1 до /example/ask/1

Кажется, я не могу получить правильное регулярное выражение. Спасибо за любую помощь. Я знаю, что есть много похожих вопросов, но я просто не мог найти решения.

Ответы [ 4 ]

2 голосов
/ 28 мая 2020

Если должен быть второй прямой sla sh присутствует в строке:

^\/[^\/\r\n]+(?=\/)

Пояснение

  • ^ Начало строки
  • \/ Соответствует первому /
  • [^\/\r\n]+ Соответствует 1+ раз любому символу, кроме / или новой строки
  • (?=\/) Положительный просмотр вперед, утверждение, что справа является вторым /

Regex demo

В качестве замены используйте первое / за которым следует example

[
  '/questions/ask/1',
  '/questions/',
  '/questions'
].forEach(s =>
  console.log(s + " --> " + s.replace(/^\/[^\/\r\n]+(?=\/)/, "/example"))
)
2 голосов
/ 28 мая 2020

var s = '/questions/ask/1';
var s2 = '/questions-math/ask/1';
var r = s.replace(/[^\/][-a-zA-Z]*/, 'example');
var r2 = s2.replace(/[^\/][-a-zA-Z]*/, 'example');
console.log(r);
console.log(r2);

EDIT:

Проблема ленивого и жадного.

Для некоторых непонятная причина, есть мода на использование ленивых регулярных выражений. Подобные выражения - не панацея от всего. В этом случае использование выражений жадного режима по умолчанию упрощает их использование и разработку.

«Более высокая производительность» также является мифом, просто подумайте об используемом алгоритме, но для иллюстрации Я сравнил эти решения, вычислив среднее значение по 100 тестов каждый один миллион замен :

I. 10-year PC, CPU 4 core 23145.70 BogoMIPS
Greedy:  278 ms
Lazy:    900 ms

II. 30-year PC, CPU 1 core 3397.11 BogoMIPS
Greedy:  6736 ms
Lazy:    7490 ms

Как видите, непоколебимое выражение оказалось медленнее, и эта разница резко увеличивается с увеличение мощности процессора.

Обратите внимание, что эти различия относятся к 1 миллиону замен, при одной замене они не имеют абсолютно никакого значения.

Естественно, так будет не во всех случаях. Если мы заботимся о производительности функции, быстрого пути нет, ответ будет дан только путем измерения путем профилирования.

2 голосов
/ 28 мая 2020

Может быть лучше использовать простой JS вот так:

var str = '/questions/ask/1';
var res = str.split("/");
res[1] = 'example';
res = res.join("/");
1 голос
/ 28 мая 2020

Вы можете использовать следующее регулярное выражение:

^(\/)(?:[-\w!#$]+)(.*?)$

Объяснение регулярного выражения:

^ - представляет начало данной строки.

(\/) - представляет 1-ю группу захвата. Эта группа используется при замене как $1.

(?:[-\w!#$]+) - представляет группу без захвата, поскольку вам необходимо заменить ее, содержащую символы слова и все специальные символы, которые вы необходимо заменить один или несколько раз . Вы можете добавить другие специальные символы, которые вам нужно исключить здесь.

(.*?) - представляет 2-ю группу захвата, захватывающую все, кроме символ новой строки лениво появляется после вашей замены. Эта группа используется при замене как $2.

$ - представляет конец данной тестовой строки.

Вы можете найти демонстрация вышеуказанного регулярного выражения в здесь.

РЕАЛИЗАЦИЯ В JAVASCRIPT:

const regex = /^(\/)(?:[-\w!#$]+)(.*?)$/gm;
const str = `/questions-math/ask/1
/questions/ask/1`;
const subst = `$1examples$2`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

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