生成正则表达式以排除路径中的字符串

时间:2018-07-02 05:41:45

标签: regex

我正在尝试编写一个正则表达式,其中包括所有以'src'开头的'component.ts'文件,但不包括那些使用'prc'在其文件路径中的文件

(src\/.*[^((?!debug).)*$]/*.component.ts)

我正在regex101测试仪上测试以下字符串:

src/abcd/debug/xtz/component/ddd/xyz.component.ts

src/abcd/arad/xtz/xyz.component.ts

这两个字符串都可以完美匹配,即使第一个字符串的路径中有“调试”字样。我要去哪里错了?

2 个答案:

答案 0 :(得分:2)

您要在character class (?!中指定否定的前行[^((?!debug).)*$],这样只会匹配字符类中的字符。

您可以做的是将否定前移移到开头,以断言后面不是/debug/debug/

^(?!.*\/debug\/)src\/.*component\.ts$

说明

  • ^断言行的开头
  • (?!.*\/debug\/)否定前瞻,断言其后的不是/debug/
  • src字面上匹配
  • \/.*component\.ts匹配一个正斜杠,后跟零个或多个字符,再跟.ts
  • $声明字符串的结尾

请注意,要从字面上匹配点,您必须将其转义\.,否则它将匹配任何字符。

答案 1 :(得分:1)

您的正则表达式匹配项:

  • src/
  • 后跟零个或多个非换行符
  • 后跟一个不在字符类((?!debug).)*$中的字符
  • 后跟零个或多个斜杠
  • 后跟非换行符
  • 后跟component
  • 后跟一个非换行符,后跟ts

换句话说,[^((?!debug).)*$]不是您可能想要的落后对象,而是字符类。

我们可以重新定义所需的匹配项,以查看我们需要什么:

  • src
  • 之后是一个或多个路径段,每个路径段都不等于debug
  • 后跟文件名

哪个给了我们

^src(?:/[^/]+(?<!debug))+/[^/]+\.component\.ts$

(请注意,如果您在JavaScript中使用正斜杠,请避免使用正斜杠。)

Try it on Regex101.

我添加了^$,因为我假设您希望整个输入匹配。如果要在较大的字符串中进行搜索,则可以将其删除,然后将[^/]的两个实例都更改为[^\n/]

顺便说一句,不需要将整个正则表达式放在括号内,因为在大多数语言中,第一个匹配项将是整个匹配的字符串。