如何在AppleScript中重复提取两个字符串间的文本?
嘿,我明白你凌晨3点卡在这里有多崩溃——作为AppleScript新手,这种重复提取多组内容的问题确实容易让人头大。让我一步步帮你理清思路,解决这个困扰你的问题。
为什么你的现有方法只能提取一次?
你用的AppleScript's text item delimiters方法其实逻辑是通的,但只取了text item 2,相当于只抓了第一组起始/结束文本之间的内容。要提取多组,咱们得用循环不断处理剩下的字符串,把每一组目标内容都捞出来。
方案1:用循环结合Text Item Delimiters批量提取
这里给你一个可以重复提取的脚本示例,假设你的起始标记是startText,结束标记是endText:
set inputString to "你的HTML字符串" set startText to "起始标记" set endText to "结束标记" set extractedValues to {} set AppleScript's text item delimiters to startText set splitByStart to text items of inputString -- 跳过第一个空的text item(如果起始文本在开头的话) repeat with i from 2 to count of splitByStart set currentChunk to item i of splitByStart set AppleScript's text item delimiters to endText set chunkParts to text items of currentChunk if count of chunkParts > 1 then set end of extractedValues to item 1 of chunkParts end if end repeat set AppleScript's text item delimiters to "" -- 现在extractedValues就是所有提取到的内容组成的列表 return extractedValues
这个脚本会把所有startText和endText之间的内容都存到extractedValues列表里,完美解决单次提取的局限。
方案2:先清理HTML标签,再精准提取
你提到用wch1zpink的方法清除HTML后,内容变成了长字符串,其实这是个非常好的方向——先把所有HTML标签去掉,变成纯文本,再提取会简单很多。比如先清理标签的脚本:
set cleanedText to do shell script "echo " & quoted form of inputString & " | sed 's/<[^>]*>//g'"
清理后你的示例HTML会变成:
Customer ID:1234567890Title:Name:FirstName LastName Primary Email:test_123@google.comAccount Email:test_abc@google.com
这时候你可以针对每个目标值单独提取,比如提取客户ID:
set AppleScript's text item delimiters to "Customer ID:" set idPart to text item 2 of cleanedText set AppleScript's text item delimiters to "Title:" set customerID to text item 1 of idPart
这种逐个提取的方法虽然看似繁琐,但胜在直观,适合新手快速上手,也就是你最后用的思路。如果想更高效,可以把这些提取逻辑写成一个自定义函数,重复调用即可。
方案3:用正则表达式一次性提取(进阶)
如果你想尝试更高效的方式,AppleScript可以配合do shell script用正则表达式批量提取。比如针对你的示例,提取所有标签内的非空文本:
set extractedTexts to do shell script "echo " & quoted form of inputString & " | grep -o '>[^<]*<' | sed 's/^>//;s/<$//' | sed '/^[[:space:]]*$/d'" -- 把结果转成列表 set AppleScript's text item delimiters to linefeed set extractedList to text items of extractedTexts set AppleScript's text item delimiters to ""
这个脚本会提取所有>和<之间的非空文本,得到的列表里就包含了你需要的客户ID、姓名、邮箱等内容,之后你可以按索引或者关键词筛选出目标值。
最后想说的
你最后改成逐个提取的方法完全没问题,作为新手,先实现功能再优化是非常合理的路径。如果之后需要处理更多批量内容,上面的循环或正则方法会帮你节省不少时间。
内容的提问来源于stack exchange,提问作者Drew Canaima

