如果字符串不包含和正则表达式

Noo*_*ser 1 applescript

我正在寻找一种在 applescript 中编写以下 javascript 代码的方法:如果条件为假,那么我想做点什么。

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

if (!regEx.test(str)){
    do something
}
Run Code Online (Sandbox Code Playgroud)

下面是我开始的applescript,但它不起作用。

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 
Run Code Online (Sandbox Code Playgroud)

在 JavaScript 中!= 没有。applescript中的等价物是什么?以及如何处理 RegEx?

我的总体目标是找出所选的查找器窗口是否在文件夹名称中不包含任何 5 位数字组合。

Rob*_*obC 6

tl;dr 对于任何版本的 macOS,>= OSX 10.8您都需要将grep's-P选项(如下面的“解决方案”部分所示)替换为该-E选项 - 如本文底部的“不同grep实用程序”部分所述。


正如评论中正确指出的那样......

Vanilla AppleScript 无法处理正则表达式。-瓦迪安

所以你需要

壳出一些确实知道正则表达式的东西 - red_menace


解决方案:

要以类似于 JavaScript 的test()方法的方式使用 vanilla AppleScript 满足您的要求,请考虑使用自定义 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
Run Code Online (Sandbox Code Playgroud)

用法:

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
Run Code Online (Sandbox Code Playgroud)

运行上面的脚本将显示一个带有给定消息的对话框,因为正则表达式和指定的字符串之间存在匹配。

注意: AppleScript 字符串使用反斜杠作为转义字符,因此您会注意到\d元字符已使用额外的反斜杠进一步转义,即\\d

不等式运算符:

在 Javascript!=中没有。applescript中的等价物是什么?以及如何处理 RegEx?

AppleScript 的不等式运算符类似于JavaScript 的不等式运算符( !=) 是:

?
is not
isn't
isn't equal [to]
is not equal [to]
doesn't equal
does not equal
Run Code Online (Sandbox Code Playgroud)

因此,鉴于您的 JavaScriptif语句:

if (!regEx.test(str)){
  // do something
}
Run Code Online (Sandbox Code Playgroud)

我们可以使用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
Run Code Online (Sandbox Code Playgroud)

注意str值仅包括四位连续数字,即1234

这次运行上面的脚本将显示一个带有给定消息的对话框,因为正则表达式和指定的字符串之间匹配。

可以对上述 AppleScriptif语句进行多种变体,以实现相同的所需逻辑。例如;

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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

等等...


regExpTest 子程序解释:

前面提到的regExpTestAppleScript 子例程本质上是利用该do shell script命令来运行以下代码,您将直接通过 macOSTerminal应用程序运行这些代码。例如,在您的Terminal应用程序中运行以下两个命令:

?
is not
isn't
isn't equal [to]
is not equal [to]
doesn't equal
does not equal
Run Code Online (Sandbox Code Playgroud)

印刷:

0

if (!regEx.test(str)){
  // do something
}
Run Code Online (Sandbox Code Playgroud)

印刷:

1


编辑:不同的grep实用程序:

正如user3439894在评论中所指出的,Mac 上安装的grep实用程序的某些版本似乎不支持-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 $?"
Run Code Online (Sandbox Code Playgroud)

改为:

set statusCode to do shell script "grep -q -E " & quoted form of re & ¬
  " <<<" & quoted form of str & " 2>/dev/null; echo $?"
Run Code Online (Sandbox Code Playgroud)

注意:-P选项已更改为,-E因此现在将模式解释为扩展正则表达式 (ERE)。

速记元字符 \d

您可能还会发现您需要更改正则表达式模式的分配:

set regExp to "\\d{5}"
Run Code Online (Sandbox Code Playgroud)

set regExp to "[0-9]{5}"
Run Code Online (Sandbox Code Playgroud)

这次速记元字符\d(用于匹配数字)已被替换为等效的字符类[0-9]