簡體   English   中英

確定一個字符串有多少個整數,雙精度數,數學運算符

[英]Determine how many Ints, Doubles, math operators a string has

我遇到了一個問題:我正在嘗試確定一個字符串有多少個Ints和Doubles,例如:

12.5+45-(67.78)*3

預期成績:

2 Ints: 45, 3

2 Doubles: 12.5, 67.78

7 symbols: .,+,-,(,.,),*

我該如何確定?
提前致謝。 我是Swift的新手

NSRegularExpression可以搜索字符串中的所有內容。 這是一個從字符串獲取數字的示例:

Swift提取正則表達式匹配

您可以使用此正則表達式字符串獲取浮點數: "\\d+\\.\\d+"也可以獲取浮點數: "\\\\d+"

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]

 */

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

一旦完成了第一級解析,對運算符,整數,數字等進行計數將變得更加容易。

這是如何生成解析數組的示例:

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

然后,您可以使用此數組來滿足您的各種需求,此外,您還可以使用.start和.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變量)。

公式子字符串將在每個運算符和運算符之后的任何字符(starts變量)處開始。

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

我本可以將子字符串放在數組中,但是由於您需要公式字符串中的位置,因此我也將其與索引范圍(已解析的變量)組成一個元組。

一旦擁有了解析的數組,對運算符,整數等進行計數就成為了簡單的過濾問題。

請注意,這僅適用於單字符運算符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM