我有一个字符串,它将用于创建文件名。原始字符串模式可能包括一个破折号。最近,模式发生了变化,我需要处理正则表达式,以删除字符串末尾或中间的破折号,而不是字符串开头的破折号。
正则表达式模式规则/要求:
潜在字符串的例子:
意见:就我个人而言,我不喜欢在文件名中包含破折号,但这是必需的
目前的Regexp解决方案:
var str = "23-564-8 Testing the String";
str.replace(/[^a-zA-Z0-9-]/g, '_').replace(/__/g, '_');问:处理这个案子最好的方法是什么?我的当前解决方案将所有破折号保留在字符串中。
发布于 2020-06-03 21:34:13
您可以使用此正则表达式进行负展望:
/[^a-zA-Z0-9-]+|-(?!\d)/gRegEx详细信息:
[^a-zA-Z0-9-]+:任何字符中没有连字符或字母数字的匹配1或多个字符。|:或-(?!\d):如果连字符后面没有紧跟数字,则匹配连字符代码:
const arr = [
'23-564-8 Testing the String',
'Testing - The String',
'-23-564-8 Testing - The - String'
]
const re = /[^a-zA-Z0-9-]+|-(?!\d)/g
var result = []
arr.forEach(el => {
result.push( el.replace(re, '_').replace(/_{2,}/g, '_') )
})
console.log( result )
发布于 2020-06-03 21:32:12
下面的Regex模式可以与替换字符串$1_一起使用(参见演示):
(\d+(?:-+\d+)+)?[\W\-_]+
该模式由两部分组成:
(\d+(?:-+\d+)+)?用允许的破折号捕获Group1中的数字。[\W\-_]+捕获要替换的特殊字符需要使用Group1来防止允许的破折号被替换。替换字符串中的$1令牌确保Group1的内容将保留在结果中。
这个Regex模式还处理重复_字符的场景,因此不再需要.replace(/__/g, '_')。代码可转换为:
var str = "23-564-8 Testing the String";
var res = str.replace(/(\d+(?:-+\d+)+)?[\W\-_]+/g, "$1_");
console.log(res);
https://stackoverflow.com/questions/62181111
复制相似问题