我有一个像这样的文件夹结构:

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.tsAnimalLib/index.ts,即不指定文件名。

我尝试了以下方法:


/AnimalLib\\.*.ts/new RegExp('AnimalLib' + '\\' + path.sep + '.*.ts')

AnimalLib的子目录(即Birds/Hawk.tsMammals/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

09-25 17:22