【问题标题】:Check if contains four digits year number in apple script检查苹果脚本中是否包含四位数字年份
【发布时间】:2020-05-07 03:13:09
【问题描述】:

现在我正在处理file-rename-applescript-project。这是一个示例:The.Fantasy.1997.DVDRip.XviD-ETRG.avi

现在我想检查文件名是否包含四位数的年份。在这种情况下,它是 1997。年份编号必须以 19 或 20 开头,并且必须包含四位数字。

如果结果为真,我会做某事,如果结果为假,我会做其他事。 我尝试使用正则表达式,但找不到解决方案。它超出了我的范围。现在我在这里寻求帮助,谢谢一百万。

【问题讨论】:

  • 假设您的文件名为TheFantasy1997.DVDRip.XviD-ETRG.avi,那么应该发生什么?我们是否应该将1997 视为一年并在范围内?

标签: regex applescript contains


【解决方案1】:

如果您想完全避免使用正则表达式,请使用文本项分隔符执行以下操作:

(*
    This first bit breaks the string up into a list of words by cutting the string 
    at the period delimiter.
*)
set tid to my text item delimiters
set my text item delimiters to "."
set bits_list to text items of file_name_string
set my text item delimiters to tid

(*
    This repeat loop goes though the list of words and tests them (first) to see 
    if it can be converted to an integer, and (second) whether the number is between
    1900 and 2100. If so, it chooses it as the year.
*)
repeat with this_item in bits_list
    try
        set possibleYear to this_item as integer
        if possibleYear ≥ 1900 and possibleYear < 2100 then
            -- do what you want with the year value here
            exit repeat
        end if
    end try
end repeat

当然,如果名称中有数字(例如,“2001.A.Space.Odyssey.1968.avi”)或文件名有不同的分隔符(例如,空格或短跑)。但是使用正则表达式也会遇到这些问题,所以...

【讨论】:

    【解决方案2】:

    由于您只想检查文件名是否包含 1900-2099 范围内的四位数年份,您可以通过定义如下处理程序来非常简单地做到这一点:

    on hasYearInTitle(filmTitle as text)
        repeat with yyyy from 1900 to 2099
            if yyyy is in the filmTitle then return true
        end repeat
    
        return false
    end hasYearInTitle
    

    然后你可以调用这个处理程序并传递一个电影标题,像这样:

    hasYearInTitle("The.Fantasy.1997.DVDRip.XviD-ETRG.avi") --> true
    hasYearInTitle("The.Fantasy.197.DVDRip.XviD-ETRG.avi") --> false
    hasYearInTitle("2001.A.Space.Odyssey.1968.avi") --> true
    hasYearInTitle("2001.A.Space.Odyssey.avi") --> true (hm...)
    

    附带说明,newznab 服务器索引的电影遵循严格的文件命名协议,允许媒体服务器(在您的机器上)轻松解析并快速提取信息,与(如您的示例文件名所示)有关:电影的标题、电影的发行日期、源材料、编码质量、编码格式(编解码器)、发行组和包含的文件格式。

    虽然有些文件名包含更多信息,但有些文件名应该始终按固定顺序出现。如果您需要,这使您自己解析它们非常简单,但是如果您希望创建一个有组织的媒体库,您最好使用媒体服务器,其中有优秀的免费软件,长期可用的软件选项适用于 macOS 和几乎任何其他操作系统。

    【讨论】:

    • 双重检查。这个对我有用。非常感谢。我只能接受一个答案。 @Ted Wrigley 的回答也是正确的和更早的。我找到了一种将它放入我的键盘大师项目的方法。所以我接受他的回答。但是您的答案也是正确的(并且更简单)。再次感谢您!
    • OP 说 “年份编号必须以 19 或 20 开头,并且必须包含四位数字”。但是,假设我们将文件名Foo.Bar.11997.DVDRip.XviD-ETRG.avi 传递给返回truehasYearInTitle 子例程,即它错误地认为11997 在年份范围内。
    • @RobC 感谢您发现这一点,这是一个非常明显的错误,我没有考虑过。会更新,但现在头疼欲裂,所以我的屏幕时间即将被强制为零一段时间。
    • @CJK - 早日康复! OP 的作者必须有一个值得信赖和标准化的文件名约定,因为他们说它对他们有用 - 同样适用于接受的答案。根据this example,我沿着炮击路线前往grephasYearInRange 函数确定给定的文件名是否包含一个隔离的 4 个连续数字组,范围从 1900 到 2099。它不依赖于严格的文件命名约定。我真的很想使用 Perl 正则表达式,因为它支持 Negative Look(behind|ahead) 这会导致 ....
    • @CJK - set exitStatus to do shell script "grep -Pq '(?&lt;![0-9])(19|20)[0-9][0-9](?![0-9])' &lt;&lt;&lt;" &amp; fileName &amp; "; echo $?" 代替。在上一个链接提供的要点中,我不得不使用 ERE 来模仿它并检查匹配字符串的长度 - 遗憾的是 macOS 上的 grep 不再支持 -P 选项 :(
    【解决方案3】:

    正则表达式.+\.(?:19:20)\d{2}\..+ 应该这样做

    细分:

    .+ 1 个或多个任意字符
    \. 一个实际的点
    (?:19|20) 字符串“19”或“20”(非捕获组)
    \d{2} 正好是两个数字
    \. 一个实际的点
    .+ 1 个或多个任意字符

    【讨论】:

    • 感谢您的回复。在 regex101.com/r/1ZXb61/1 上, (19|20)\d{2} 有效。但是如何检查它是否存在?以及如何将其放入applescript?
    猜你喜欢
    • 2013-01-31
    • 2019-09-01
    • 2023-03-24
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    相关资源
    最近更新 更多