【问题标题】:Node.js regex: exclude path separator while matching filesNode.js 正则表达式:匹配文件时排除路径分隔符
【发布时间】:2018-03-14 06:31:56
【问题描述】:

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

src
|
|-- AnimalLib
|   |-- index.ts
|   |-- Animal.ts
|   |-- Mammals
|   |   |-- Cat.ts
|   |   |-- Dog.ts
|   |-- Reptiles
|   |   |-- Snake.ts
|   |-- Birds
|   |   |-- Hawk.ts

假设我有一个数组中所有文件的完整路径,例如['src/AnimalLib/Mammals/Cat.ts', ...]

我想编写一个 RegExp 以通用方式选择 only 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. /AnimalLib\\(?!\\).*.ts/new RegExp('AnimalLib' + '\\' + path.sep + '(?!' + '\\' + path.sep + ')' + '.*.ts')

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

    这也没有用。

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

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

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

但是,我不喜欢这种解决方案,因为它不容易重现。

【问题讨论】:

  • arr.filter(x =&gt; x.match(/\/AnimalLib\/\w*\.ts/)) 如果您知道您的文件将只有字母、数字和/或下划线。
  • 文件名中也会有连字符。

标签: javascript node.js regex


【解决方案1】:

一种可能的方法是使用这个正则表达式\/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

【讨论】:

  • 虽然这确实有效(我已经用类似的解决方案更新了我的问题),但我觉得它并不涵盖所有情况,例如我的文件名中有一个连字符。我只想排除路径分隔符,并允许所有其他字符。
  • 嗯,我明白了,那么您可以使用除运算符 [^\/]。我刚刚编辑了我的帖子,并把它放了一个链接,以查看它是否正常工作。干杯!
  • 是的,工作。为了使其独立于操作系统,我将答案更新为new RegExp('AnimalLib' + '\\' + path.sep + '([^' + '\\' + path.sep + ']+.ts)'),它在Windows 上的计算结果为/AnimalLib\\([^\\]+.ts)/。在那次小小的编辑之后,我会接受这个答案。
【解决方案2】:

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

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

为了测试看看here

【讨论】:

  • “文件夹结构”只是为了说明。我实际上有一个数组中每个文件的完整路径。
  • 如果有帮助,请不要不喜欢这个答案:AnimalLib\/?()(Animal\.ts|index\.ts)link
  • 抱歉,没办法。该问题指定文件的名称不应该是正则表达式的一部分。 AnimalLib 下可能有 200 个文件,无法将它们全部列出。
  • AnimalLib\/\w+\.ts 试过这个吗?
  • 最后一个几乎可以工作,但是斜线的转义是不正确的。我已经接受了上面的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多