2017-04-08 32 views
0

我停留在从HTML身体得到一个字符串我们怎样才能删除除了数字,点和冒号之外的每个字符?

<html><head> 
<title>Uaeexchange Mobile Application</title></head><body> 
<div id='ourMessage'> 
    49.40:51.41:50.41  
</div></body></html> 

我想获得含49.40字符串:51.41:50.41。我不想通过字符串提前或索引来完成。我可以通过指定我需要的数字,点(。)和冒号(:)在迅速获得此字符串。我的意思是一些数字和一些特殊字符?

我试图

let stringArray = response.componentsSeparatedByCharactersInSet(
        NSCharacterSet.decimalDigitCharacterSet().invertedSet) 
       let newString = stringArray.joinWithSeparator("") 
       print("Trimmed\(newString)and count\(newString.characters.count)") 

但这显然修剪掉点和结肠过。任何建议朋友?

回答

3

你的问题的简单答案是,你需要包括“。”。 “&”:“在你想要保留的集合中。

let response: String = "<html><head><title>Uaeexchange Mobile Application</title></head><body><div id='ourMessage'>49.40:51.41:50.41</div></body></html>" 

var s: CharacterSet = CharacterSet.decimalDigits 

s.insert(charactersIn: ".:") 

let stringArray: [String] = response.components(separatedBy: s.inverted) 

let newString: String = stringArray.joined(separator: "") 

print("Trimmed '\(newString)' and count=\(newString.characters.count)") 
// "Trimmed '49.40:51.41:50.41' and count=17\n" 

不上还有什么你的回答应该是:了解更多信息,我真的不能给一个更好的答案,但从根本上这不是一个很好的解决方案。如果响应已经

<html><head><title>Uaeexchange Mobile Application</title></head><body> 
    <div id='2'>Some other stuff: like this</div> 
    <div id='ourMessage'>49.40:51.41:50.41</div> 
</body></html> 

使用替换/删除解决方案,这是一个黑客,而不是算法 - 它会工作,直到它没有。 我想你应该在寻找<div id='ourMessage'>并从那里读到下一个<,但是我们需要更多关于响应格式规范的信息。

+0

'让newString = stringArray.joined()' –

+0

@LeoDabus我用OP的代码和可能的,但你当然是正确的 - 不需要类型或不必要的空字符串参数。为了清晰起见,我只是添加了类型 - 我认为这是一个很好的练习。 – Grimxn

3

我建议你使用一个HTML解析器,不过这是正则表达式一个简单的解决方案:

let extractedString = response.replacingOccurrences(of: "[^\\d:.]+", with: "", options: .regularExpression) 

还是积极正则表达式搜索的是更多的代码,但也更可靠:

let pattern = ">\\s?([\\d:.]+)\\s?<" 

let regex = try! NSRegularExpression(pattern: pattern) 
if let match = regex.firstMatch(in: response, range: NSMakeRange(0, response.utf8.count)) { 
    let range = match.rangeAt(1) 
    let startIndex = response.index(response.startIndex, offsetBy: range.location) 
    let endIndex = response.index(startIndex, offsetBy: range.length) 
    let extractedString = response.substring(with: startIndex..<endIndex) 
    print(extractedString) 
} 

虽然简单(负)正规表达式搜索删除所有不匹配数字,点和冒号的字符,但正搜索也考虑关闭(>)和开始标记(<)围绕期望的结果,所以意外的数字,点或冒号与模式不匹配。

0

也可以使用String.replacingOccurrences()方法在其他方面,没有正则表达式,如下所示:

import Foundation 
var response: String = "<html><head><title>Uaeexchange Mobile Application</title></head><body><div id='ourMessage'>49.40:51.41:50.41</div></body></html>" 
let charsNotToBeTrimmed = (0...9).map{String($0)} + ["." ,":"] // you can add any character you want here, that's the advantage 
for i in response.characters{ 
    if !charsNotToBeTrimmed.contains(String(i)){ 
     response = response.replacingOccurrences(of: String(i), with: "") 
    } 
} 
print(response) 

基本上,这造成其不应该被修剪字符数组和字符是否为不能在那里,它得到的for-loop

删除,但你必须要提醒你正在试图做的是不完全正确......

+0

请注意,修剪你正在迭代的数组并不是最好的选择,我只想告诉你一个替代以前的答案,顺便说一句,这很好! –

相关问题