Чтобы сделать это правильно, вам нужен stack
для поддержания открывающих скобок. Когда вы получите открывающую скобку, положите ее на стопку. Когда вы получите закрывающую скобку, вытолкните верхнюю открывающую скобку из стопки и убедитесь, что они совпадают. Когда вы закончите анализ строки, stack
должно быть пустым.
enum Balance {
case balanced
case unbalanced(String)
}
func checkBalance(_ str: String) -> Balance {
var stack = [Character]()
for char in str {
if ["{", "(", "["].contains(char) {
stack.append(char)
} else if ["}", ")", "]"].contains(char) {
if let top = stack.popLast() {
switch (top, char) {
case ("{", "}"), ("(", ")"), ("[", "]"):
break
default:
return .unbalanced("mismatched braces: \(top), \(char)")
}
} else {
return .unbalanced("unexpected close brace: \(char)")
}
}
}
if !stack.isEmpty {
return .unbalanced("missing \(stack.count) closing braces")
}
return .balanced
}
Тесты:
checkBalance("{ [ ( ) ] }")
blockquote>.balanced
checkBalance("{ [ ] { } }")
blockquote>.balanced
checkBalance("[(")
[ 116] blockquote>checkBalance("{ [ ( ) }")
blockquote>.unbalanced("mismatched braces: [, }")
checkBalance("}")
blockquote>.unbalanced("unexpected close brace: }")
Примечание:
[ 1122]checkBalance
возвращает перечисление типаBalance
. Чтобы проверить, равен ли результат.balanced
, вы должны сделать это следующим образом:
if case .balanced = checkBalance("() { [ ] }") { // handle balanced case }
или можете использовать
switch
:switch checkBalance("() { [ ] }") { case .balanced: // do something if balanced case .unbalanced(let reason): print("Not balanced: \(reason)") }
Из ссылки, которую OP отправил с ответом:
При загрузке XML-файлов локально, например, CD-ROM и т.д., данные, полученные Internet Explorer, являются простым текстом, не text/xml. В этом случае используйте параметр типа данных, чтобы загрузить XML-файл как текст и проанализировать возвращенные данные в функции успеха
$.ajax({
url: "data.xml",
dataType: ($.browser.msie) ? "text" : "xml",
success: function(data){
var xml;
if (typeof data == "string") {
xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = false;
xml.loadXML(data);
} else {
xml = data;
}
// Returned data available in object "xml"
}
});
Это работало на меня также.
Просто мысль: Я помню, что некоторые ПОЛУЧАЮТ отказы запросов с IE. Вы попытались ОТПРАВИТЬ его?