我有一个像这样的文件夹结构:
src
|
|-- AnimalLib
| |-- index.ts
| |-- Animal.ts
| |-- Mammals
| | |-- Cat.ts
| | |-- Dog.ts
| |-- Reptiles
| | |-- Snake.ts
| |-- Birds
| | |-- Hawk.ts
假设我拥有数组中所有文件的完整路径,例如['src/AnimalLib/Mammals/Cat.ts', ...]
我想编写一个RegExp,以通用方式选择仅 AnimalLib/Animal.ts
和AnimalLib/index.ts
,即不指定文件的名称。
我尝试了以下内容:
/AnimalLib\\.*.ts/
,即new RegExp('AnimalLib' + '\\' + path.sep + '.*.ts')
AnimalLib
子目录中的所选文件,即Birds/Hawk.ts
,Mammals/Cat.ts
等
/AnimalLib\\.*?.ts/
,即new RegExp('AnimalLib' + '\\' + path.sep + '.*.ts')
我在这里懒得选择.*?.ts
,希望它只选择AnimalLib/
下的文件。没有骰子。这也选择了AnimalLib
/AnimalLib\\(?!\\).*.ts/
,即new RegExp('AnimalLib' + '\\' + path.sep + '(?!' + '\\' + path.sep + ')' + '.*.ts')
这里我尝试使用负前瞻排除路径分隔符,因此无法选择AnimalLib
的子文件夹。我在Windows系统上。
这也没有效果。
我应该如何构建这个正则表达式?我可以使用/.../
或new RegExp(...)
格式。
到目前为止唯一有效的方法是排除除\
以外的所有键盘字符:
new RegExp('AnimalLib' + '\\' + path.sep
+ '[- a-zA-Z0-9()\\[\\]{}\'"_!@#$%^&*?:;<>,.|]+'
+ '.ts')
但是,我不喜欢这个解决方案,因为复制起来并不简单。
答案 0 :(得分:2)
可能的方法是使用此正则表达式\/AnimalLib\/[^\/]*\.ts
:
let arr = ['src/AnimalLib/index-app_main.ts', 'src/AnimalLib/@Animal-foo.ts', 'src/AnimalLib/Mammals/Cat.ts', 'src/AnimalLib/Mammals/Dog.ts', 'src/AnimalLib/Reptiles/Snake.ts', 'src/AnimalLib/Birds/Hawk.ts']
var results = arr.filter(x => x.match(/\/AnimalLib\/[^\/]*\.ts/));
console.log(results); // returns original values
var results2 = arr.reduce((acc, ele) => {
var res = ele.match(/\/AnimalLib\/[^\/]*\.ts/)
return res ? acc.concat(res) : acc;
}, [])
console.log(results2); // retrns only matches string
看到它正常工作here
答案 1 :(得分:1)