Ruby 将所有文件名与给定扩展名(特定文件名除外)匹配

Ruby 将所有文件名与给定扩展名(特定文件名除外)匹配,ruby,regex,Ruby,Regex,我有以下正则表达式: ^((?!.*/gradle-wrapper\.jar$)|(.*\.jar$)|(.*\.exe$)) 以及以下数据: rupe-engine/src/main/groovy/com/rupe/engine/JongoAutoConfiguration.java gradle/wrapper/gradle-wrapper.jar gradle/wrapper/gradle-bundle.exe gradle/wrapexe/gradle.git testit.j

我有以下正则表达式:

^((?!.*/gradle-wrapper\.jar$)|(.*\.jar$)|(.*\.exe$))
以及以下数据:

rupe-engine/src/main/groovy/com/rupe/engine/JongoAutoConfiguration.java

gradle/wrapper/gradle-wrapper.jar

gradle/wrapper/gradle-bundle.exe

gradle/wrapexe/gradle.git

testit.jar
预期结果:

匹配
gradle/wrapper/gradle bundle.exe
testit.jar

实际结果:

也匹配
gradle/wrapper/gradle wrapper.jar
,尽管我试图“黑名单”这个文件名。

您的正则表达式“出现故障”,因为您使用了一个前瞻分支作为替代分支,因此不再限制模式

您似乎希望匹配以
.jar
.exe
结尾的字符串,而不是以
/gradle wrapper.jar
结尾的字符串。使用

^(?!.*/gradle-wrapper\.jar$).*\.(?:jar|exe)$

详细信息

  • ^
    -字符串的开头
  • (?!.*/gradle wrapper\.jar$)
    -如果在任何0+个字符(
    *
    )之后有紧跟字符串结尾的
    /gradle wrapper.jar
    子字符串(
    $
    ),则匹配失败
  • *\.
    -将任何0+字符(除换行字符外)匹配到最后一个
  • (?:jar | exe)
    -要么
    jar
    要么
    exe
  • $
    -字符串结束
您的正则表达式“运行不正常”,因为您使用了前瞻分支作为替代分支,因此它不再限制模式

您似乎希望匹配以
.jar
.exe
结尾的字符串,而不是以
/gradle wrapper.jar
结尾的字符串。使用

^(?!.*/gradle-wrapper\.jar$).*\.(?:jar|exe)$

详细信息

  • ^
    -字符串的开头
  • (?!.*/gradle wrapper\.jar$)
    -如果在任何0+个字符(
    *
    )之后有紧跟字符串结尾的
    /gradle wrapper.jar
    子字符串(
    $
    ),则匹配失败
  • *\.
    -将任何0+字符(除换行字符外)匹配到最后一个
  • (?:jar | exe)
    -要么
    jar
    要么
    exe
  • $
    -字符串结束

您想要实现的逻辑是什么?你的数据是什么?这是一个大字符串还是一组字符串?@scphantm我试着重新命名你的标题/问题,使它更容易理解。请查看我的更改,如有必要,请重新编辑。以后,请参阅,以获得关于什么是好问题的摘要。您想要实现的逻辑是什么?你的数据是什么?这是一个大字符串还是一组字符串?@scphantm我试着重新命名你的标题/问题,使它更容易理解。请查看我的更改,如有必要,请重新编辑。以后,请看一个关于什么是好问题的总结。该死,我就差一点了。非常感谢你。再过20年,我可能会弄明白正则表达式。@scphantm:如果你还没有这样做,请在、通读(以及许多其他链接到伟大的在线资源)和所谓的社区完成所有课程。A也是一个很棒的网站,你可以学到很多关于如何在那里工作。”ScPHANTM:如果答案对你有帮助,请考虑一下投票。非常感谢你。再过20年,我可能会弄明白正则表达式。@scphantm:如果你还没有这样做,请在、通读(以及许多其他链接到伟大的在线资源)和所谓的社区完成所有课程。A也是一个很棒的网站,你可以学到很多关于如何在那里工作。”ScPHANTM:如果答案对你有帮助,请考虑一下投票。