Если строка НЕ ​​содержит и REGEX - PullRequest
1 голос
/ 12 апреля 2019

Я ищу способ написать следующий код javascript в applecript: если условие ложно, я хочу что-то сделать.

var regEx = /\d{5}/g;
var str = 'This string contains 12345';

if (!regEx.test(str)){
    do something
}

Ниже приведен яблочный скрипт, который я начал, но он не работает.

set str to 'This string contains 12345'
set regEx to <NOT SURE HOW APPLESCRIPT HANDLES THIS>

if string does contains "12345" then
 do something
end if 

В Javascript! = нет. Что является эквивалентом в AppleScript? и как мне справиться с RegEx?

Моя общая задача - выяснить, не содержит ли выбранное окно поиска искомую комбинацию из 5 цифр в имени папки.

Ответы [ 2 ]

3 голосов
/ 12 апреля 2019

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].

0 голосов
/ 12 апреля 2019

Как уже говорили другие, вы можете использовать платформу Foundation NSRegularExpression через мост AppleScript-ObjC.

Тем не менее API Objective-C, хотя и мощные, не совсем совместимы с AppleScripter, поэтому я собрал несколько «стандартных библиотек» несколько лет назад, которые обернули многое из этого.общая функциональность в виде хороших нативных команд AppleScript.

Например, вот ближайший эквивалент вашего JavaScript с помощью команды search text библиотеки Text:

use script "Text"

set str to "This string contains 12345"

set foundMatches to search text str for "\\d{5}" using pattern matching

if foundMatches is not {} then
    -- do something
end if

Не удалось вызвать большой интерес, поэтому я больше не занимаюсь разработкой или поддержкой.Но они бесплатны и открыты (насколько мне известно, общественное достояние) и все еще отлично работают в текущей версии macOS AFAIK, так что помогите себе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...