0

我有以下工作示例 AppleScript 片段:

set str to "This is a string"

set outlist to {}
repeat with wrd in words of str
    if wrd contains "is" then set end of outlist to wrd
end repeat

我知道 AppleScript 中的 who 子句通常可用于替换诸如此类的重复循环以显着提高性能。然而,对于文本元素列表,如单词、字符和段落,我无法找到一种方法来完成这项工作。

我努力了:

set outlist to words of str whose text contains "is"

这失败了:

error "Can’t get {\"This\", \"is\", \"a\", \"string\"} whose text contains \"is\"." number -1728

,大概是因为“文本”不是文本类的属性。查看text class 的 AppleScript Reference,我看到“引用的表单”是 text 类的属性,所以我有一半的预期是这样的:

set outlist to words of str whose quoted form contains "is"

但这也失败了,有:

error "Can’t get {\"This\", \"is\", \"a\", \"string\"} whose quoted form contains \"is\"." number -1728

有没有办法用 AppleScript 中的 who 子句替换这样的重复循环?

4

2 回答 2

1

从AppleScript 1-2-3的第 534 页(处理文本)开始

AppleScript 不将段落、单词和字符视为可编写脚本的对象,这些对象可以通过在使用过滤器引用或其子句的搜索中使用它们的属性或元素的值来定位。

这是另一种方法:

set str to "This is a string"
set outlist to paragraphs of (do shell script "grep -o '\\w*is\\w*' <<< " & quoted form of str)
于 2013-09-13T22:22:50.753 回答
1

正如@adayzdone 所示。看起来你不走运。

但是你可以尝试像这样使用 offset 命令。

    set wrd to "I am here"
        set outlist to {}

        set str to " This is a word"

  if ((offset of space & "is" & space in str) as integer) is greater than 0 then set end of outlist to wrd

注意 "is" 周围的空格。这可以确保 Offset 找到一个完整的单词。否则,偏移量将在“This”中找到第一个匹配的“is”。

更新。

按照 OP 的需要使用它

set wrd to "I am here"
set outlist to {}

set str to " This is a word"
repeat with wrd in words of str

    if ((offset of "is" in wrd) as integer) is greater than 0 then set end of outlist to (wrd as string)
end repeat

-->{“这个”,“是”}

于 2013-09-14T07:05:26.677 回答