我有一个Angular的反应形式,它以文本输入的形式获取文件格式
<input type="text" name="formats" formControlName= "formats">
例如:.txt, .zip, .tar.gz
我需要将这些输入转换为数组列表。在@ danday74的帮助下,我能够做到这一点。这是代码:
const input = ".txt, .zip, .tar.gz"
const parts = input.split(' ')
const output = parts.map(x => x.replace(',', '').replace('.', ''))
console.log(output)
代码生成的输出为["txt","zip","tar.gz"]
,这是我所期望的。
但是,我担心的是,如果用户输入类似.. ., .tar.gf.ds ,.tar
或tar tar.gz zip
的内容,则输出分别为[".","","tar.gf.ds","tar"]
和["tar","targz","zip"]
我的问题是我该如何实现这种方式,以使用户可以输入没有任何特定结构的文件格式(例如.txt, .zip, .tar.gz,
.txt .zip .tar.gz
,txt, zip, tar.gz
,{{ 1}}),我应该能够生成类似txt zip tar.gz
的输出。就像我应该能够忽略只是["txt","zip","tar.gz"]
或..
的输入,而只考虑带字符串的输入。
答案 0 :(得分:2)
这是一种通用的方法!
如果字符串中的任何地方有两个..
!不要添加它。
可能还剩下一些用例,如果有的话请发表评论
var strings = [
".txt, .zip, .tar.gz",
"..txt .zip .tar.gz a.b.should.be.in",
"txt, zip, tar.gz",
".., ..., ...., .this.should.be.in, .not..this"
]
var extensions = []
strings
.forEach((item) => {
let items = item.split(',');
if (items.length <= 1) {
items = item.split(' ');
}
items.forEach(ext => {
const trimedExt = ext.trim()
if (
trimedExt.indexOf('..') === -1
) {
if (trimedExt[0] === '.') {
extensions.push(trimedExt.substr(1))
} else {
extensions.push(trimedExt)
}
}
});
})
console.log(extensions)
答案 1 :(得分:2)
如果您只关心领先.
和,
,则可以使用正则表达式,如下所示:
const input = '.txt, .zip, .tar.gz, ,.tar, txt, zip, tar.gz, .., .,'
const output = input.split(', ')
.map(ext => ext.replace(/^\W+/, '')) // remove any character that's not a word character from the beginning of each string
.filter(Boolean); // filter just to remove empty strings
console.log(output);
如果您还需要删除结尾字符,则可以修改正则表达式以将其从结尾处也删除:
const input = '.txt, .zip, .tar.gz, ,.tar, txt, zip, tar.gz, .txt., .tar.gz., ,.tar,., .., .,'
const output = input.split(' ') // split on space character as trailing commas will be handled in the regex
.map(ext => ext.replace(/^\W+|\W+$/g, ''))
.filter(Boolean);
console.log(output);
让我知道是否还有其他考虑事项。