使用RegEx替换第二个正斜杠后的字符串

eqqqjvef  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(115)

有一个字符串(URL路径),例如:/this/is/some/url我想删除第一次出现的/,并将第二个正斜杠之后的字符串(在示例中为some)更改为另一个字符串,比如is。结果应该是this/is/a/url,这是我得到的:

let myUrl = '/this/is/some/url';
let splitUrl = myUrl.split('/').filter(v => v !== '');

splitUrl[2] = 'a';
let newUrl = splitUrl.join('/');

console.log(newUrl); // this/is/a/url

字符串
但是现在我想把它变成一个RegEx,所以我想出了这个:

const myUrl = '/this/is/some/url';
const modifiedUrl = myUrl.replace(/[a-zA-Z0-9]/, 'a').replace(/^\//, '');

console.log(modifiedUrl); // ahis/is/some/url


但结果不是我想要的,因为它输出:ahis/is/some/url。我承认我不太擅长使用RegEx。
一些SO帖子herehere对我没有帮助,因为我仍然不知道如何只替换第二个正斜杠之后的内容。
能帮我吗

46qrfjad

46qrfjad1#

您可以使用

let myUrl = '/this/is/some/url';
const modifiedUrl = myUrl.replace(/\/((?:[^\/]*\/){2})[^\/]*/, '$1a');
console.log(modifiedUrl); // this/is/a/url

字符串
请参阅this regex demo。* 详细信息 *:

  • \/-一个/字符
  • ((?:[^\/]*\/){2})-第1组:除了/+一个/字符以外的任何零个或多个字符的两次出现
  • [^\/]*-除了/之外的零个或多个字符。

替换是对Group 1值的反向引用+将插入到结果字符串中的新字符串。
要替换下一个URL子部分,只需将\/[^\/]*添加到正则表达式模式中:

let myUrl = '/this/is/some/url';
const str1 = 'content1';
const str2 = 'content2'
const rx = /\/((?:[^\/]*\/){2})[^\/]*\/[^\/]*/;

const modifiedUrl = myUrl.replace(rx, '$1' + str1 + '/' + str2);

console.log(modifiedUrl); // this/is/content1/content2


主要思想保持不变:捕获要替换的文本之前的文本,然后只匹配需要替换的文本,并且-在替换中-使用对捕获的文本的反向引用,并追加要替换的文本。

注意:如果你的替换文本包含一个文字$,后面跟着一个数字,你实际上不想把它当作一个反向引用,而是作为一个文字,你应该把.replace(/\$/g, '$$$$')添加到上面代码中的每个变量str1str2

vql8enpb

vql8enpb2#

我会选择一种将任务一分为二的方法

  • 其中第一个替换使用正则表达式,该正则表达式专门针对字符串值的前导斜杠... /^\// ...然后...
  • 其中,第二替换使用正则表达式,该正则表达式精确地针对第三路径段或路径部分…这里的直接替换通过利用正后看来实现,其中后者以xxx/yyy/形式的两个后续路径段的序列为目标。
    优势在于能够处理两种路径变体,即带前导斜杠的路径变体和不带前导斜杠的路径变体。
console.log(
  'this/is/some/url ...',

  'this/is/some/url'
    // see ... [https://regex101.com/r/jfcZBU/2]
    .replace(/^\//, '')
    // see ... [https://regex101.com/r/jfcZBU/1]
    .replace(/(?<=^(?:[^/]+\/){2})[^/]+/, 'a')
);
console.log(
  '/this/is/some/url ...',

  '/this/is/some/url'
    .replace(/^\//, '')
    .replace(/(?<=^(?:[^/]+\/){2})[^/]+/, 'a')
);

个字符
在组合/合并两个正则表达式模式的情况下,也有利于不必使用正向后看(though every relevant browser meanwhile does support this feature),正则表达式然后变得更复杂,因此更难以读取。/^\/*((?:[^/]+\/){2})[^/]+/的函数。

const regXPathCapture =
  // see ... [https://regex101.com/r/jfcZBU/3]
  /^\/*((?:[^/]+\/){2})[^/]+/;

console.log(
  "'this/is/some/url'.replace(regXPathCapture, '$1a') ...",
  'this/is/some/url'.replace(regXPathCapture, '$1a')
);
console.log(
  "'/this/is/some/url'.replace(regXPathCapture, '$1a') ...",
  '/this/is/some/url'.replace(regXPathCapture, '$1a')
);
.as-console-wrapper { min-height: 100%!important; top: 0; }

的字符串

相关问题