Javascript:使用正则表达式映射字符串并仅包含匹配的组

问题描述 投票:0回答:1

我有一些根据其内容命名的文件。有些文件是单个部分,有些文件包含多个部分。不幸的是我无法改变这个结构。

使用 JavaScript,我想使用正则表达式来匹配文件名,然后使用任何匹配的组来创建新文件名。正则表达式本身仅部分匹配文件名。

例如:

来自
MyTestString1-id1p01&p02.Part1And2.txt 1-2。第1部分和第2部分.txt
MyTestString2-id1p03.Part3.txt 3.第三部分.txt
MyTestString3-id1p04.Part4.txt 4.第四部分.txt

我尝试使用正则表达式来匹配文件名:

(?:p(\d+))(?:&p(\d+))?\.(.+)\.

这有效并为我提供了我想要的匹配:

MyTestString1-id1p01&p02.Part1And2.txt -> [p01&p02.Part1And2., 01, 02, Part1And2]
MyTestString2-id1p03.Part3.txt -> [p03.Part3., 03, Part3]
MyTestString3-id1p04.Part4.txt -> [p04.Part4., 04, Part4]

但是我找不到一个很好的方法来映射到我想要的字符串。我想要类似的东西

$1-$2. $3

但是

string.replace
仅替换匹配项,并且仍然包含字符串的其余部分。所以我最终得到:
MyTestString1-id101-02. Part1And2txt
而不是
1-2. Part1And2.txt
。这是有道理的,它正在替换我需要更像模板的东西。

对于其他没有第二部分的人,我得到:

MyTestString2-id103-. Part3txt
其中包含我不想要的
-

是否有类似于仅使用替换字符串的

string.replace
?有没有一种方法可以选择为可能存在的组添加分隔符,如果不存在则将其排除?

另请注意,文件名比我的示例中的文件名大得多,我只是将它们剪短,因为我忽略了它们。

提前致谢。

javascript regex string templating
1个回答
0
投票

你可以使用

p(\d+)(?:&p(\d+))?\.(.+\.[^.]*)$

请参阅下面的 JS 演示代码:

const texts = ['MyTestString1-id1p01&p02.Part1And2.txt', // 1-2. Part1And2.txt
'MyTestString2-id1p03.Part3.txt', //    3. Part3.txt
'MyTestString3-id1p04.Part4.txt'] //    4. Part4.txt
const re = /p(\d+)(?:&p(\d+))?\.(.+\.[^.]*)$/;
for (const s of texts) {
  const [_,num1,num2,filename] = re.exec(s)
  result = `${Number(num1)}` + (num2 ? `-${Number(num2)}. `:'. ') + filename;
  console.log(s, '=>', result);
}

© www.soinside.com 2019 - 2024. All rights reserved.