AppleScriptで「○○という文字列があったら」という分岐をしたい時

お世話になります。

AppleScriptについて質問です。


とある文字列の中に、「-○.jpg」という文字があったら、という条件分岐をしたいです。

○の部分は毎回変動する可能性がありますが、必ず一文字であるということは決まってます。

そして、直前のハイフンと拡張子に関しては絶対に変わりません。


その場合ってどう書いたらいいのでしょうか?


MacBook Pro

投稿日 2022/07/13 17:20

返信
スレッドに付いたマーク ランキングトップの返信

投稿日 2022/07/13 19:49

前掲のスクリプトでは複数のコードポイントの組み合わせから成る文字を正しくカウントするためにコードがちょっと複雑になりましたが、例えば「xxx-1.jpg」や「あああ-a.jpg」のように「○」が必ず英数字 [a-zA-Z0-9] ならもっと簡単に書けます。


on run
    set str to "xxx-1.jpg"
    if my func(str) then
        true
    else
        false
    end if
end run

on func(str)
    do shell script "osascript -l JavaScript <<'EOF' - " & str's quoted form & "
function run(argv) {
    return /-[^-]\\.jpg/.test(argv[0]);
}
EOF"
    return result as boolean
end func


返信: 4
スレッドに付いたマーク ランキングトップの返信

2022/07/13 19:49 Hiro__S への返信

前掲のスクリプトでは複数のコードポイントの組み合わせから成る文字を正しくカウントするためにコードがちょっと複雑になりましたが、例えば「xxx-1.jpg」や「あああ-a.jpg」のように「○」が必ず英数字 [a-zA-Z0-9] ならもっと簡単に書けます。


on run
    set str to "xxx-1.jpg"
    if my func(str) then
        true
    else
        false
    end if
end run

on func(str)
    do shell script "osascript -l JavaScript <<'EOF' - " & str's quoted form & "
function run(argv) {
    return /-[^-]\\.jpg/.test(argv[0]);
}
EOF"
    return result as boolean
end func


2022/07/13 19:07 s55k1n8 への返信

JavaScript の正規表現を使った方法を考えてみました。


JavaScript の部分をざっくり説明すると、まず、「○」の部分は「-以外の任意のn文字」と考え、「-○.jpg」にマッチした場合「○」が1文字なら true、1文字でないなら false を返し、マッチしない場合は false を返すようにしてます。


あと、文字数のカウントの部分はちょっと複雑。AppleScript の length や count では文字数を書記素クラスタ単位で数えてくれますが JavaScript にはそのようなカウント方法がないので Objective-C の助けを借りてます。


on run
    set str to "xxx-あ.jpg"
    if my func(str) then
        true
    else
        false
    end if
end run

on func(str)
    do shell script "osascript -l JavaScript <<'EOF' - " & str's quoted form & "
function run(argv) {
    const matched = argv[0].match(/-([^-]+)\\.jpg/);
    if (matched) {
        const str = $(matched[1]);
        const len = str.js.length;
        let i = 0;
        let c = 0;
        while (i < len) {
            const range = str.rangeOfComposedCharacterSequenceAtIndex(i);
            c++;
            i += Number(range.length);
        }
        return c === 1 ? true : false;
    } else {
        return false
    }
}
EOF"
    return result as boolean
end func


動作確認: Mojave 10.14.6


2022/07/13 21:36 s55k1n8 への返信

○にはいるものが必ず英数字なので


それなら簡単な方で大丈夫ですね。


ところで、前掲のコードですが、文字列が「xxx-あ.jpg xxx-い.jpg」の場合に「-い.jpg」にマッチさせるなら次にように変更してください。(まあ、このようなファイル名は想定しなくても良いかもしれませんが、一応。)


# 詳細版 (最初に投稿したコード)


変更前

const matched = argv[0].match(/-([^-]+)\\.jpg/);


変更後

const matched = argv[0].match(/-([^-]+)\\.jpg$/);


ーーーーー


# 簡易版


変更前

return /-[^-]\\.jpg/.test(argv[0]);


変更後

return /-[^-]\\.jpg$/.test(argv[0]);


このスレッドはシステム、またはAppleコミュニティチームによってロックされました。 問題解決の参考になる情報であれば、どの投稿にでも投票いただけます。またコミュニティで他の回答を検索することもできます。

AppleScriptで「○○という文字列があったら」という分岐をしたい時

Apple サポートコミュニティへようこそ
Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple Account を使ってご参加ください。