AppleScriptで「○○という文字列があったら」という分岐をしたい時
お世話になります。
AppleScriptについて質問です。
とある文字列の中に、「-○.jpg」という文字があったら、という条件分岐をしたいです。
○の部分は毎回変動する可能性がありますが、必ず一文字であるということは決まってます。
そして、直前のハイフンと拡張子に関しては絶対に変わりません。
その場合ってどう書いたらいいのでしょうか?
MacBook Pro
お世話になります。
AppleScriptについて質問です。
とある文字列の中に、「-○.jpg」という文字があったら、という条件分岐をしたいです。
○の部分は毎回変動する可能性がありますが、必ず一文字であるということは決まってます。
そして、直前のハイフンと拡張子に関しては絶対に変わりません。
その場合ってどう書いたらいいのでしょうか?
MacBook Pro
前掲のスクリプトでは複数のコードポイントの組み合わせから成る文字を正しくカウントするためにコードがちょっと複雑になりましたが、例えば「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
前掲のスクリプトでは複数のコードポイントの組み合わせから成る文字を正しくカウントするためにコードがちょっと複雑になりましたが、例えば「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
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
○にはいるものが必ず英数字なので
それなら簡単な方で大丈夫ですね。
ところで、前掲のコードですが、文字列が「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]);
ありがとうございます。
○にはいるものが必ず英数字なので、前者のコードと合わせてこちらも参考にさせていただきます。
javascriptとAppleScriptの組み合わせで出来るのか!と感激です。
本当にありがとうございました!
AppleScriptで「○○という文字列があったら」という分岐をしたい時