正则表达式以去除重音符号、特殊字符但保留破折号、下划线和扩展名。

6

我正在尝试去除重音和特殊字符,但保留破折号(-)、下划线(_)并保留扩展名。

例如:

ÁÉÍÓÚáéíóúâêîôûàèìòùÇãç.,~!@#$%&_-12345.png

到:

AEIOUaeiouaeiouaeiouCac_-12345.png

我得到了这个结果,但问题是它忽略了所有的点。我需要仅忽略最后一次出现以保留文件名的扩展名。

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

我已经尝试过像这样的负向后瞻:

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

使用这个参考资料,但是我没有成功。

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

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


.normalize('NFD').replace(/[^a-zA-Z0-9-._]/g, '')”有什么问题吗?它看起来可以满足你的需求,而不会过于复杂化。 - Christian Vincenzo Traina
1
иҝҷйҮҢжңүдёҖдёӘдҪҝз”ЁеүҚзһ»зҡ„жғіжі•пјҡ[^\w.-]+|\.(?=[^.]*\.) - bobble bubble
3个回答

3
在您的模式中,忘记排除下划线(_),因为您想在结果中保留它。
您正在使用一个负向零宽断言(negative lookbehind),它断言从当前位置开始,左侧没有直接跟着一个点号(dot)。
否定字符类[^a-zA-Z0-9-]+可以匹配点号(dot),但是负向零宽断言(?<!\.)会在匹配到点号(dot)时失败,因此它永远不会匹配任何点号(dot)。
您可以做的是,匹配这个字符类[^a-zA-Z0-9-]+,但要断言从当前位置向右,有一个点号(dot),后面跟着1个或多个非点号(dot)或空白符(whitespace)直到字符串末尾,使用正向零宽先行断言(?=.*\.[^\s.]+$)

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


3

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

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) 的组,它只是为了解释而命名的)


2
一个负向先行断言可以排除任何跟随非单词字符的任何字母或数字后面跟着的 .
/[^a-zA-Z0-9-._]|\.(?![a-zA-Z0-9]+\b)/g

一个替代 [^a-zA-Z0-9-._] 的方法是 [^\w.-]

RegEx101

解释

片段 描述
[^a-zA-Z0-9-._]
排除任何字母、数字、连字符、下划线和点
|
或者
\.(?![a-zA-Z0-9]+\b)
排除任何点,该点不是后面跟着一个或多个字母和/或数字,然后是一个非单词字符

示例

const rgx = /[^a-zA-Z0-9-._]+|\.(?![a-zA-Z0-9]+\b)/g;

const str = `ÁÉÍÓÚáéíóúâêîôûàèìòùÇãç.,~!@#\$%&_-12345.png`;

const file = str.replace(rgx, "");

console.log(file);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接