2017-04-21 46 views

回答

0

我建議分解子字符串中的公式並將信息放置在允許您訪問單個組件的數組中。

一旦完成了第一級解析,計算運算符,整數,數字等將會更容易。

這裏是你如何能產生解析陣列的例子:

let formula = "10+12.44/(3.14*7+20)" 

let operators = "+-*/()" 
let operSet = Set(operators.characters) 


let flags = formula.characters.indices 
       .map{($0,operSet.contains(formula[$0]))} 
       // [(String.Index,Bool)] 

let starts = zip(flags, [(formula.startIndex,true)] + flags) 
       .filter{ $0.1 || $1.1 }.map{$0.0.0} 
       // [String.Index] 

let parsed = zip(starts, starts.dropFirst() + [formula.endIndex]) 
       .map{ (string:formula[$0..<$1], start:$0, end:$1) } 
       // [(String, String.Index, String.Index)] 

// parsed will contain tupples with substrings and start/end indexes 
// 
// .string .start .end 
// ------- ------ ---- 
// 10   0  2 
// +   2  3 
// 12.44  3  8 
// /   8  9 
// (   9  10 
// 3.14  10  14 
// *   14  15 
// 7   15  16 
// +   16  17 
// 20   17  19 
// )   19  20 

然後,您可以使用此陣爲您的各種需求,並作爲獎勵,你有。開始和.END去各的子模型

let operators = parsed.filter{operators.contains($0.string)} 

let integers = parsed.filter{Int($0.string) != nil} 

let decimals = parsed.filter{$0.string.contains(".")} 

它的工作方式是首先標記所有對應於運算符(flags變量)的字符串索引。

公式子字符串將在每個運算符上以及跟在運算符後面的任何字符(啓動變量)開始。

一旦有了所有用於式子串的起始位置的字符串索引,我們只需要將它們轉換爲範圍(即,從每個開始到下一個),並提取子到一個數組。

我可能只是放在子數組中,但因爲你需要在公式字符串的位置,我把它與索引範圍內的元組,以及(解析變量)。

一旦你有了解析數組,計數操作符,整數等就成爲一個簡單的過濾事項。

請注意,這隻適用於單字符操作符。

+0

謝謝,它對我很好:) –

1

NSRegularExpression可以搜索字符串的一切。這是一個例子,從字符串獲得數:

Swift extract regex matches

您可以使用此正則表達式字符串獲得浮點數:"\d+\.\d+"或此得到詮釋號:"\\d+"

1
let math = "+-/*()" 
let teststring = "10+12.44/(3.14*7+20)" 

let isOperator = { c in 
    math.characters.contains(c) 
} 


let numbers = teststring.characters.split(whereSeparator: isOperator).map(String.init) 
let operators = teststring.characters.filter(isOperator) 

let integers = numbers.flatMap { Int($0) } 
let doubles = numbers.flatMap { c->Double? in 
    if let i = Int(c) { 
     return nil 
    } else { 
     return Double(c) 
    } 
} 

print("\(operators.count) operators \(operators)") 
print("\(integers.count) integers \(integers)") 
print("\(doubles.count) doubles \(doubles)") 

/* prints 

6 operators ["+", "/", "(", "*", "+", ")"] 
3 integers [10, 7, 20] 
2 doubles [12.44, 3.1400000000000001] 

*/