替换第一次出现和第二次出现的正斜杠之间的字符串



我对正则表达式不是很熟悉,我需要帮助替换其中第一次和第二次出现的正斜杠之间的字符串值。

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

我似乎无法正确更正正则表达式。 感谢您的任何帮助。我知道有很多类似的问题,但我就是找不到解决方案。

最好使用这样的简单 JS:

var str = '/questions/ask/1';
var res = str.split("/");
res[1] = 'example';
res = res.join("/");

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);

编辑:

懒惰与贪婪的问题。

出于某种难以理解的原因,有一种使用惰性模式正则表达式的时尚。这样的表达方式并不是万能的。在这种情况下,使用默认贪婪模式表达式使它们更易于使用和开发。

"更高的性能"也是一个神话,想想使用的算法,但为了说明,我通过计算每一百万个替换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

如您所见,坚定不移的表达速度变慢了,并且随着处理器功率的增加,这种差异急剧增加。

请注意,这些差异与 100 万个替换有关,只有一个替换它们绝对没有意义。

当然,并非在所有情况下都是如此。如果我们关心一个功能的性能,没有捷径,只有通过分析进行测量才能给出答案。

如果字符串中必须存在第二个正斜杠:

^/[^/rn]+(?=/)

解释

  • ^字符串开头
  • /匹配第一个/
  • [^/rn]+匹配 1+ 乘以除/或换行符以外的任何字符
  • (?=/)积极的展望,断言右边的是第二个/

正则表达式演示

在替换中使用第一个/,然后是example

[
'/questions/ask/1',
'/questions/',
'/questions'
].forEach(s =>
console.log(s + " --> " + s.replace(/^/[^/rn]+(?=/)/, "/example"))
)

您可以使用以下正则表达式:

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

正则表达式的解释:

^- 表示给定字符串的开头。

(/)- 表示第一个捕获组。此组在替换中用作$1

(?:[-w!#$]+)- 表示非捕获组,因为您需要替换包含单词字符和需要替换一次或多次的所有特殊符号的组。不过,您可以在此处添加需要排除的其他特殊符号。

(.*?)- 表示第二个捕获组捕获除替换后懒惰的新行字符之外的所有内容。此组在替换中用作$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);

最新更新