tl; dr Для любой версии macOS >= OSX 10.8
вам необходимо заменить параметр grep
-P
(как указано в решении "" раздел ниже) с опцией -E
- как упомянуто в разделе " Разные grep
утилиты " в нижней части этого поста.
Как правильно отмечено в комментариях ...
Vanilla AppleScript не может обрабатывать регулярные выражения.- vadian
, поэтому вам нужно
использовать что-то, что знает регулярное выражение - red_menace
Решение:
Чтобы удовлетворить ваши требования с ванильным AppleScript способом, аналогичным методу JavaScript test()
, рассмотрите возможность использования пользовательской подпрограммы AppleScriptследующим образом:
Подпрограмма:
on regExpTest(str, re)
set statusCode to do shell script "grep -q -P " & quoted form of re & ¬
" <<<" & quoted form of str & " 2>/dev/null; echo $?"
if statusCode is equal to "0" then
return true
else
return false
end if
end regExpTest
Использование:
set regExp to "\\d{5}"
set str to "This string contains 12345"
if regExpTest(str, regExp) then
display dialog "It DOES match so let's do something"
end if
При запуске вышеупомянутого сценария отобразится диалоговое окно с данным сообщением, поскольку междурегулярное выражение и указанная строка.
Примечание: В строках AppleScript обратная косая черта используется в качестве escape-символа, поэтому вы заметите, что метасимвол \d
был дополнительно экранирован с помощьюдополнительная обратная косая черта, т.е. \\d
Неравенство операторов:
В Javascript !=
нет.Что является эквивалентом в AppleScript?и как мне обрабатывать RegEx?
операторы AppleScript неравенства , аналогичные оператор неравенства JavaScripts (!=
):
≠
is not
isn't
isn't equal [to]
is not equal [to]
doesn't equal
does not equal
Итак, учитывая ваше утверждение JavaScript if
:
if (!regEx.test(str)){
// do something
}
Мы можем добиться той же логики (снова используя вышеупомянутую пользовательскую подпрограмму regExpTest
), с помощью следующегокод:
set regExp to "\\d{5}"
set str to "This string contains 1234"
if regExpTest(str, regExp) ≠ true then
display dialog "It DOES NOT match so let's do something"
end if
Примечание Значение str
включает только четыре последовательные цифры, т. е. 1234
.
На этот раз выполняетсяПриведенный выше сценарий отобразит диалоговое окно с данным сообщением, поскольку NOT соответствует регулярному выражению и указанной строке.
Существует множество вариантов, которые могут быть внесены в вышеупомянутый AppleScript if
заявление для достижения той же желаемой логики.Например;
if regExpTest(str, regExp) is not equal to true then
...
end if
if regExpTest(str, regExp) = false then
...
end if
и т. Д.
regExpTest
объяснение подпрограммы:
Вышеупомянутая regExpTest
подпрограмма AppleScript по существу используеткоманда do shell script
для запуска следующего кода, который вы будете запускать напрямую через приложение macOS Terminal
.Например, в вашем приложении Terminal
выполните следующие две команды:
grep -q -P "\d{5}" <<<"This string contains 12345" 2>/dev/null; echo $?
Prints:
0
grep -q -P "\d{5}" <<<"This string contains 1234" 2>/dev/null; echo $?
Prints:
1
РЕДАКТИРОВАТЬ: Различные grep
утилиты:
Как отмечено в комментарии user3439894 кажется, что некоторые версии grep , установленные на Mac, не поддерживают параметр -P
, который гарантировал, что шаблон RegExp интерпретировался как регулярное выражение Perl.Причина, по которой я решил использовать регулярные выражения Perl, заключается в том, что они более точно выровнены с регулярным выражением, используемым в JavaScript.
Однако, если вы запустите man grep
через командную строку и обнаружите, что ваш grep
Утилита не предоставляет опцию -P
, затем измените следующую строку кода в подпрограмме regExpTest
:
set statusCode to do shell script "grep -q -P " & quoted form of re & ¬
" <<<" & quoted form of str & " 2>/dev/null; echo $?"
вместо этого:
set statusCode to do shell script "grep -q -E " & quoted form of re & ¬
" <<<" & quoted form of str & " 2>/dev/null; echo $?"
Примечание: Параметр -P
был изменен на -E
, поэтому вместо этого шаблон теперь интерпретируется как расширенное регулярное выражение (ERE).
Сокращенный метасимвол \d
Вы также можете найти, что вам нужно изменить назначение шаблона регулярного выражения с:
set regExp to "\\d{5}"
на
set regExp to "[0-9]{5}"
На этот раз сокращенный метасимвол \d
(используется для совпадения с цифрой) заменено на эквивалентный класс символов [0-9]
.