如何解决在AppleScript中实现正则表达式以精确匹配6个数字
我是Regex和AppleScript的新手,我需要一点支持和指导。
第一个用户输入一个字符串。可以是一行或多行中的任何内容。
应在字符串上应用正则表达式,以便查找仅包含6位数字的数字。或多或少,并用空格分隔。
最后一个字符串应类似于:867689,867617,866478,866403,866343
。
然后,此字符串将被转换为列表。 我正在使用此网站测试我的正则表达式:https://www.freeformatter.com/regex-tester.html
与6位数字完全匹配的正则表达式为:
(?<!\d)\d{6}(?!\d)
我知道,要对AppleScript实施Regex,我需要使用Shell Script。我也知道我应该使用sed
,但不幸的是,我并不完全知道如何使用它以及确切的含义。
通过一些指导和测试,我了解sed无法与\d
一起使用,我应该改用[0-9]
,并且也应该像这样\(..\)
括住括号。同样,替换$1,
的实现应类似于\1,
。直到这一刻,我还是无法使它工作。
我用于测试的用户输入如下:
MASTER
ARTIKEL
Artikel
5910020015
867689
PULL1/1
5910020022
867617
PULL1/1
Cappuccino
5910020017
866478
PULL1/1
Braun
5921020017
866403
SHIRT1/2
Kastanie-Multi
5910020016
866343
PULL1/1
和AppleScript代码本身:
use scripting additions
use AppleScript version "2.4" -- Yosemite (10.10) or later
use framework "Foundation"
on list2string(theFoldersList,theDelimiter)
set theBackup to AppleScript's text item delimiters
set AppleScript's text item delimiters to theDelimiter
set theString to theFoldersList as string
set AppleScript's text item delimiters to theBackup
return theString
end list2string
on run {input}
display dialog "Please enter your string: " default answer ""
set stringOfNumbers to the text returned of the result
set num to do shell script "sed 's/\(\(?<![0-9]\)[0-9]{6}\(?![0-9]\)\)\1,/' <<< " & quoted form of stringOfNumbers
--(?<!\d)\d{6}(?!\d)
display dialog stringOfNumbers
set stringOfNumbers to current application's NSString's stringWithString:stringOfNumbers
set listOfArtNumbers to (stringOfNumbers's componentsSeparatedByString:",") as list
display dialog list2string(listOfArtNumbers,",")
return input
end run
不幸的是,我在任何地方都使用\
来转义字符,但都遇到错误。因此,我不得不删除所有\
,但是一旦运行脚本,我就会收到"Syntax Error: sed: 1: "s/(?<![0-9])[0-9]{6}(?! ...": unterminated substitute pattern"
,而我的所有努力也导致了类似的错误。
解决方法
从OS 10.7(Lion)开始,AppleScript Objective-C允许我们使用<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup,System,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089">
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection,EntityFramework,Version=6.0.0.0,PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</sectionGroup>
</configSections>
...
进行正则表达式。以下处理程序以列表的形式返回正则表达式搜索的结果:
NSRegularExpression
请注意,“¬”符号是行继续符号(AppleScript编辑器中键入option-return)。我已经分行以使脚本更具可读性,但是可能无法正确复制/粘贴,因此请注意,这些行应该是连续的单行。
您可以按以下方式使用此处理程序。请记住,反斜杠是AppleScript中的特殊字符,因此必须在其前面加上另一个反斜杠来对其进行转义:
use AppleScript version "2.4"
use framework "Foundation"
property NSRegularExpression : class "NSRegularExpression"
property NSString : class "NSString"
on findPattern:thePattern inString:theString
set theText to NSString's stringWithString:theString
set theRegEx to NSRegularExpression's regularExpressionWithPattern:thePattern ¬
options:0 |error|:(missing value)
set theResult to (theRegEx's matchesInString:theText ¬
options:0 ¬
range:{location:0,|length|:theText's |length|})'s valueForKey:("range")
set outputArray to {}
repeat with thisRange in theResult
copy (theText's substringWithRange:thisRange) as text to end of outputArray
end repeat
return outputArray
end findPattern:inString:
编辑
似乎Automator不喜欢我使用的set foundList to my findPattern:"(?<!\\d)\\d{6}(?!\\d)" inString:"MASTER
ARTIKEL
Artikel
5910020015
867689
PULL1/1
5910020022
867617
PULL1/1
Cappuccino
5910020017
866478
PULL1/1
Braun
5921020017
866403
SHIRT1/2
Kastanie-Multi
5910020016
866343
PULL1/1"
-- Result: {"867689","867617","866478","866403","866343"}
方法,因此我们不得不切换到另一种形式:使用property ClassName : class "ClassName"
修改后的Automator AppleScript看起来像这样(假设文本字符串作为输入传递):
current application's ClassName's ...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。