【问题标题】:regex return a match if NO match found [duplicate]如果未找到匹配项,则正则表达式返回匹配项[重复]
【发布时间】:2019-12-16 06:59:12
【问题描述】:

我有一个文件命名模式,例如

这是一个 9876 文件名 .1234.ext

或

thisisa9876filename .4321.ext

我可以使用 .1234.ext 轻松地返回匹配项

/(\.\d{4}\.ext)$/

如果不是那种格式,我想做的是找到一个匹配项。例如

thisisa9876filename.123.ext

或

这是一个 9876 文件名.txe

如果它不匹配我想返回匹配的模式,那么有效。

我似乎无法解决这个问题。任何帮助将不胜感激。

【问题讨论】:

  • 为什么不直接反转当前正则表达式匹配的输出?
  • 也许尝试从字符串末尾向后看
  • 您输入的格式是什么?几行?句子?
  • 你的环境/口味是什么?是 grep、perl、...?您使用什么工具来应用正则表达式?你如何应用正则表达式?

标签: regex


【解决方案1】:

要了解@Nick 建议的解决方案,并假设您使用或有权访问 R,解决方案可能是这样的: 如果这是(像)您的数据:

data <- c("thisisa9876filename .4321.ext", "thisisa9876filename.123.ext", 
          "this is a 9876 file name.txe", "this is a 9876 file name .1234.ext")

那么您可以使用grep及其invert = T 参数来匹配模式不匹配的任何内容:

grep("\\d{4}\\.ext$", data, value = T, invert = T)
[1] "thisisa9876filename.123.ext"  "this is a 9876 file name.txe"

【讨论】:

    【解决方案2】:

    如果支持负前瞻(?!,您可以断言该字符串不以您的模式结尾:

    ^(?!.*\.\d{4}\.ext$).+$
    
    • ^ 字符串开始
    • (?!负前瞻,断言右边的不是
      • .*\.\d{4}\.ext$ 在字符串末尾匹配一个点和 4 位数字,后跟 .ext
    • ) 关闭前瞻
    • .+ 匹配除换行符以外的任何字符 1 次以上
    • $ 字符串结束

    Regex demo

    【讨论】:

    • 第四只鸟太棒了。谢谢你。如果您有时间解释一下逻辑,那将非常有帮助,谢谢。
    • @Kent 我已经添加了对模式不同部分的解释。
    • 太棒了,谢谢。现在这是有道理的。看来我的问题是在否定前瞻之后没有匹配所有字符。如果否定前瞻为真,那么有效地表示匹配所有字符。非常感谢@第四只鸟
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2017-10-11
    • 1970-01-01
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    相关资源
    最近更新 更多