我正在尝试编写一个正则表达式,其中包括所有以'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
这两个字符串都可以完美匹配,即使第一个字符串的路径中有“调试”字样。我要去哪里错了?
答案 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中使用正斜杠,请避免使用正斜杠。)
我添加了^
和$
,因为我假设您希望整个输入匹配。如果要在较大的字符串中进行搜索,则可以将其删除,然后将[^/]
的两个实例都更改为[^\n/]
。
顺便说一句,不需要将整个正则表达式放在括号内,因为在大多数语言中,第一个匹配项将是整个匹配的字符串。