Node.js正则表达式:匹配文件时排除路径分隔符

时间:2018-03-14 06:31:56

标签: javascript node.js regex

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

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,即不指定文件的名称。

我尝试了以下内容:

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

    AnimalLib子目录中的所选文件,即Birds/Hawk.tsMammals/Cat.ts

  2. /AnimalLib\\.*?.ts/,即new RegExp('AnimalLib' + '\\' + path.sep + '.*.ts')

    我在这里懒得选择.*?.ts,希望它只选择AnimalLib/下的文件。没有骰子。这也选择了AnimalLib

  3. 子目录中的文件
  4. /AnimalLib\\(?!\\).*.ts/,即new RegExp('AnimalLib' + '\\' + path.sep + '(?!' + '\\' + path.sep + ')' + '.*.ts')

    这里我尝试使用负前瞻排除路径分隔符,因此无法选择AnimalLib的子文件夹。我在Windows系统上。

    这也没有效果。

  5. 我应该如何构建这个正则表达式?我可以使用/.../new RegExp(...)格式。

    到目前为止唯一有效的方法是排除除\以外的所有键盘字符:

    new RegExp('AnimalLib' + '\\' + path.sep 
        + '[- a-zA-Z0-9()\\[\\]{}\'"_!@#$%^&*?:;<>,.|]+' 
        + '.ts')
    

    但是,我不喜欢这个解决方案,因为复制起来并不简单。

2 个答案:

答案 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)

使用以下正则表达式仅检测AnimalLib目录中的所有ts文件

AnimalLib\/[^/]+?\.ts

测试看看here