首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >处理文件名正则表达式中的Dash字符

处理文件名正则表达式中的Dash字符
EN

Stack Overflow用户
提问于 2020-06-03 19:25:47
回答 2查看 963关注 0票数 1

我有一个字符串,它将用于创建文件名。原始字符串模式可能包括一个破折号。最近,模式发生了变化,我需要处理正则表达式,以删除字符串末尾或中间的破折号,而不是字符串开头的破折号。

正则表达式模式规则/要求:

  1. 将所有特殊字符替换为下划线,但有一些例外。
  2. 移除不在字符串开头的破折号。
  3. 需要保留的破折号通常在数值0-9之间,可以在字符串中出现任意次数(即"23-564-8测试-字符串“->”23-564-8_ kept _ The _ String“)
  4. 应该转换为下划线的破折号通常在a-zA字符之间(即“测试-字符串”-> "testing_the_string")

潜在字符串的例子:

  1. 23-564-8测试字符串->预期输出:23-564-8_ the _the_ String
  2. 测试-字符串->预期输出: testing_the_string
  3. 23-564-8测试-字符串->预期输出:23-564-8_ The _the_ String

意见:就我个人而言,我不喜欢在文件名中包含破折号,但这是必需的

目前的Regexp解决方案:

代码语言:javascript
运行
复制
var str = "23-564-8 Testing the String"; 
str.replace(/[^a-zA-Z0-9-]/g, '_').replace(/__/g, '_');

问:处理这个案子最好的方法是什么?我的当前解决方案将所有破折号保留在字符串中。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-03 21:34:13

您可以使用此正则表达式进行负展望:

代码语言:javascript
运行
复制
/[^a-zA-Z0-9-]+|-(?!\d)/g

RegEx详细信息:

  • [^a-zA-Z0-9-]+:任何字符中没有连字符或字母数字的匹配1或多个字符。
  • |:或
  • -(?!\d):如果连字符后面没有紧跟数字,则匹配连字符

代码:

代码语言:javascript
运行
复制
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 )

票数 1
EN

Stack Overflow用户

发布于 2020-06-03 21:32:12

下面的Regex模式可以与替换字符串$1_一起使用(参见演示):

(\d+(?:-+\d+)+)?[\W\-_]+

该模式由两部分组成:

  1. (\d+(?:-+\d+)+)?用允许的破折号捕获Group1中的数字。
  2. [\W\-_]+捕获要替换的特殊字符

需要使用Group1来防止允许的破折号被替换。替换字符串中的$1令牌确保Group1的内容将保留在结果中。

这个Regex模式还处理重复_字符的场景,因此不再需要.replace(/__/g, '_')。代码可转换为:

代码语言:javascript
运行
复制
var str = "23-564-8 Testing the String";

var res = str.replace(/(\d+(?:-+\d+)+)?[\W\-_]+/g, "$1_");

console.log(res);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62181111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档