regex 正则表达式删除重音符号、特殊字符,但保留破折号、下划线和扩展

v7pvogib  于 2023-04-13  发布在  其他
关注(0)|答案(3)|浏览(118)

我试图删除重音符号和特殊字符,除了破折号(-),下划线(_),并保留字符串的扩展名,例如:
ÁÉÍÓÚáéíóúâêîôûàèìòùÇãç.,~!@#$%&_-12345.png
致:
AEIOUaeiouaeiouaeiouCac_-12345.png
我得到了这个结果,但问题是它忽略了所有的点。我只需要忽略最后一次出现的点来保留文件名的扩展名。

我已经试过像这样的消极的向后看:

/[^a-zA-Z0-9-]+(?<!\.)/g

我用了reference,但没有成功。

"ÁÉÍÓÚáéíóúâêîôûàèìòùÇãç.,~!@#$%&-12.34.5.png".normalize('NFD').replace(/[^a-zA-Z0-9-]+(?<!\.)/g, '')

如果我有多个点在这种情况下,它只删除第一个.

6l7fqoea

6l7fqoea1#

function cleanFilename(filename) {
// Remove accents and special characters while preserving dash, underline, and file extension
const cleaned = filename.normalize('NFD').replace(/[\u0300-\u036f]/g, '')
 .replace(/[^\w\s.-]/g, '')
 .replace(/[-\s]+/g, '-')
 .toLowerCase();
return cleaned;
}

const filename = "file_näme.txt";
const cleanedFilename = cleanFilename(filename);
console.log(cleanedFilename);

1.开始,我们使用normalize()函数和NFD参数将所有内容还原为基本形式。
1.结合replace()和正则表达式/[\u0300-\u036f]/g,我们可以删除重音符号和字符,如反引号和变音符号
1.最后,我们注意在一组其他正则表达式中使用replace来获得我们要查找的字符串的格式

9q78igpj

9q78igpj2#

不要检查每个字符是否是文件扩展名,而是一次选择整个扩展名

let nfd = "ÁÉÍÓÚáéíóúâêîôûàèìòùÇãç.,~!@#$%&-12.34.5.png".normalize('NFD')

let exttest = nfd.replace(/(?<extension>\.[^.]+$|)(?:<badchar>.?)/g, '$1')
console.log({ exttest }) // { "exttest": ".png" }

let result = nfd.replace(/(?<extension>\.[^.]+$|)(?:<badchar>[^a-zA-Z0-9-]?)/g, '$1')
console.log({ result }) // { "result": "AEIOUaeiouaeiouaeiouCac-12345.png" }

(?<name>blah)只是一个命名的(blah)组,它的命名只是为了解释)

6kkfgxo0

6kkfgxo03#

您可以使用lookahead来测试 * 不是最后一个点 ,以检查前面是否会有另一个点。为了保留下划线,还可以使用\w 单词字符 *),这是[A-Za-z0-9_]short

[^\w.-]+|\.(?=[^.]*\.)

See this demo at regex101
点也需要放在交替中的否定左边,让右边触发。

相关问题