我正在写一个需要取字符串的AppleScript,只输出该字符串中的数字。我有一个有效的方法
do shell script "sed s/[a-zA-Z\\']//g <<< " & s
其中s是输入字符串,但是这个脚本正在进行数千次这样的操作,它最终会花费大约20分钟来完成它们。有什么方法可以让它更快吗?
预期输入是一个字符串,几乎可以包含任何内容(除了/
或\
除外。我试图让没有空白字符,因为这会破坏我的方法,但有时我会得到一个仍然)。预期输出是一串数字(或空字符串)。例如,“1人为51罐啤酒支付1,23美分”的句子将具有简单的“112351”的期望输出,并且“我h8处理所有这些麻木”将输出“83”
答案 0 :(得分:2)
如果你真的必须一次从字符串中选择数字,那么这种方法可能更快,即使看起来更多,但我应该告诉你,指定tr命令的完整路径,如果只是几毫秒的话就会节省一些。
set mlist to "1 man paid 1,23 cents for 51 can\\'s of beer "
script o
property l : missing value
end script
set o's l to words of mlist
repeat with i from 1 to (count o's l)
try
item i of o's l as integer
on error
set item i of o's l to missing value
end try
end repeat
set o's l to o's l's text
set tids to my text item delimiters
set my text item delimiters to space
set o's l to text items of o's l
set my text item delimiters to tids
set o's l to o's l as text
set my text item delimiters to ","
set o's l to text items of o's l
set my text item delimiters to tids
set numb3rs to o's l as text
log numb3rs
--> (*112351*)
这种方法可能会更快,因为你为每一行保存了do shell脚本的开销,如果这些数字形成良好(正确的小数点分隔符),它也应该只返回数字。我没有通过电子记谱法尝试过,但我认为这也应该有效。
答案 1 :(得分:1)
你试过tr
吗?
tr -d '[:alpha:][:punct:]' <<< string
答案 2 :(得分:0)
另一种解决方案,确保只显示数字:
do shell script "echo " & quoted form of s & "|sed s/[^0-9]//g"
答案 3 :(得分:0)
我提供这个备用代码。我不明白为什么McUsr的代码需要那么复杂。
set s to "1 man paid 1,23 cents for 51 can\\'s of beer "
set n to ""
repeat with i from 1 to (length of s)
set c to (character i of s)
# http://stackoverflow.com/questions/20313799
if class of c is number then
set n to n & c
end if
end repeat
return n