我有一个像这样的文件夹结构:
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')
但是,我不喜欢这种解决方案,因为它不容易复制。
最佳答案
一种可能的方法是使用此正则表达式\/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