我有一些根据其内容命名的文件。有些文件是单个部分,有些文件包含多个部分。不幸的是我无法改变这个结构。
使用 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
?有没有一种方法可以选择为可能存在的组添加分隔符,如果不存在则将其排除?
另请注意,文件名比我的示例中的文件名大得多,我只是将它们剪短,因为我忽略了它们。
提前致谢。
你可以使用
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);
}