无法弄清楚如何使用AppleScript实现REGEX

时间:2018-06-14 20:27:25

标签: regex sed applescript

我写了一个regex命令来查找并输出字符串中数字行的第一个实例:

find:    ^[^\d]*(\d+).*
replace: $1

问题在于,为了在AppleScript中实际使用它,我知道这样做的唯一方法是调用shell脚本并使用sed。我无法弄清楚如何以这种方式实际使用我的正则表达式。我已经好几个小时没有运气了。这是尽可能接近,但它返回字符串中的所有数字,而不是第一组数字:

set num to do shell script "sed 's/[^0-9]*//g' <<< " & quoted form of input

我真正想要的是一种使用AppleScript来处理正则表达式并找到匹配替换($ 1,$ 2等)的方法。

2 个答案:

答案 0 :(得分:2)

请注意,sed不支持像\d这样的PCRE速记字符类,也不支持括号表达式中的正则表达式转义。

此外,由于您使用POSIX BRE风格的sed(使用了-r-E选项),要定义捕获组,您需要\(...\),而不是(...)

此外,+与POSIX BRE模式中的文字+符号相匹配,您需要将其转义,但为了安全起见,您只需将a+扩展为{{ 1}}。

aa*中的替换反向引用语法为sed +数字。

使用此POSIX BRE解决方案:

\

或者,如果您使用sed 's/^[^0-9]*\([0-9][0-9]*\).*/\1/' -E选项,则使用POSIX ERE解决方案:

-r

<强>详情

  • sed -E 's/^[^0-9]*([0-9]+).*/\1/' - 字符串开头
  • ^ - 除了数字之外的0 +字符(也可以使用[^0-9]*
  • [[:digit:]]* - 启动捕获组#1(在替换模式中使用\(占位符引用)(在ERE中,\1将启动捕获组)
  • ( = [0-9][0-9]*(BRE)= [0-9]\+(ERE) - 1+位数
  • [0-9]+ - 捕获组的结尾(在POSIX ERE,\)
  • ) - 其余部分。

答案 1 :(得分:1)

虽然你有解决方案,但我认为使用AppleScript(实际上是AppleScript-ObjC)实现正则表达式匹配和替换的另一种方法可能会有用:

    use framework "Foundation"
    use scripting additions
    --------------------------------------------------------------------------------
    set regex to "(^[^\\d]*)(\\d+)(.*)"
    set input to "There are 250 billion stars in the galaxy, " & ¬
        "and 200 billion galaxies in the observable universe."

    re_match from the input against regex ¬
        given replacement:"$1two-hundred-and-fifty$3"
    --------------------------------------------------------------------------------
    on re_match against pattern from str given replacement:fmt
        set regex to current application's NSRegularExpression's ¬
            regularExpressionWithPattern:pattern ¬
                options:(current application's ¬
                NSRegularExpressionCaseInsensitive) ¬
                |error|:(missing value)

        (regex's stringByReplacingMatchesInString:str ¬
            options:0 range:{0, length of str} ¬
            withTemplate:fmt) ¬
            as text
    end re_match

<强>结果:

"There are two-hundred-and-fifty billion stars in the galaxy, and 200 billion galaxies in the observable universe."