我写了一个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等)的方法。
答案 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."