Вы можете предварительно загрузить изображения
function preloadImages(srcs, imgs, callback) {
var img;
var remaining = srcs.length;
for (var i = 0; i < srcs.length; i++) {
img = new Image();
img.onload = function() {
--remaining;
if (remaining <= 0) {
callback();
}
};
img.src = srcs[i];
imgs.push(img);
}
}
// then to call it, you would use this
var imageSrcs = ["src1", "src2", "src3", "src4"];
var images = [];
preloadImages(imageSrcs, images, myFunction);
Компьютерный термин для того, что Вы делаете, является лексическим анализом; считайте это для хорошей сводки этой общей задачи.
На основе Вашего примера я предполагаю, что Вы хотите, чтобы пробел разделил Ваши слова, но материал в кавычках нужно рассматривать как "слово" без кавычек.
Самый простой способ сделать это должно определить слово как регулярное выражение:
([^"^\s]+)\s*|"([^"]+)"\s*
Это выражение указывает, что "слово" является любой (1) некавычкой, непробельный текст, окруженный пробелом, или (2) текстом некавычки, окруженным кавычками (сопровождаемый некоторым пробелом). Отметьте использование получения круглых скобок для выделения требуемого текста.
Вооруженный этим regex, Ваш алгоритм прост: ищите свой текст следующее "слово", как определено круглыми скобками получения и возвратите его. Повторите это, пока у Вас не закончатся "слова".
Вот самый простой бит рабочего кода, который я мог придумать в VB.NET. Обратите внимание, что мы должны проверить обе группы на данные, так как существует два набора получения круглых скобок.
Dim token As String
Dim r As Regex = New Regex("([^""^\s]+)\s*|""([^""]+)""\s*")
Dim m As Match = r.Match("this is a ""test string""")
While m.Success
token = m.Groups(1).ToString
If token.length = 0 And m.Groups.Count > 1 Then
token = m.Groups(2).ToString
End If
m = m.NextMatch
End While
Примечание 1: ответ Желания, выше, является той же идеей как этот. Надо надеяться, этот ответ объясняет детали позади сцены немного лучше :)
Microsoft. VisualBasic. Пространство имен FileIO (в Microsoft.VisualBasic.dll) имеет TextFieldParser, который можно использовать для разделения на разграниченном тексте пространства. Это обрабатывает строки в кавычках (т.е. "это - один маркер" thisistokentwo), хорошо.
Отметьте, просто потому что DLL говорит, что VisualBasic не подразумевает, что можно только использовать его в проекте VB. Его часть всей Платформы.
Craig прав — используют регулярные выражения. Regex. Разделение может быть более кратким для Ваших потребностей.
Существует подход конечного автомата.
private enum State
{
None = 0,
InTokin,
InQuote
}
private static IEnumerable<string> Tokinize(string input)
{
input += ' '; // ensure we end on whitespace
State state = State.None;
State? next = null; // setting the next state implies that we have found a tokin
StringBuilder sb = new StringBuilder();
foreach (char c in input)
{
switch (state)
{
default:
case State.None:
if (char.IsWhiteSpace(c))
continue;
else if (c == '"')
{
state = State.InQuote;
continue;
}
else
state = State.InTokin;
break;
case State.InTokin:
if (char.IsWhiteSpace(c))
next = State.None;
else if (c == '"')
next = State.InQuote;
break;
case State.InQuote:
if (c == '"')
next = State.None;
break;
}
if (next.HasValue)
{
yield return sb.ToString();
sb = new StringBuilder();
state = next.Value;
next = null;
}
else
sb.Append(c);
}
}
Это может легко быть расширено для вещей как вложенные кавычки и выход. Возврат как IEnumerable<string>
позволяет Вашему коду только анализировать столько, сколько Вам нужно. Нет никаких реальных оборотных сторон к такому ленивому подходу, поскольку строки неизменны, таким образом, Вы знаете это input
движение не должно изменяться перед парсингом всего этого.
См.: http://en.wikipedia.org/wiki/Automata-Based_Programming
Вы также могли бы хотеть изучить регулярные выражения. Это могло бы выручить Вас. Вот образец, сорванный из MSDN...
using System;
using System.Text.RegularExpressions;
public class Test
{
public static void Main ()
{
// Define a regular expression for repeated words.
Regex rx = new Regex(@"\b(?<word>\w+)\s+(\k<word>)\b",
RegexOptions.Compiled | RegexOptions.IgnoreCase);
// Define a test string.
string text = "The the quick brown fox fox jumped over the lazy dog dog.";
// Find matches.
MatchCollection matches = rx.Matches(text);
// Report the number of matches found.
Console.WriteLine("{0} matches found in:\n {1}",
matches.Count,
text);
// Report on each match.
foreach (Match match in matches)
{
GroupCollection groups = match.Groups;
Console.WriteLine("'{0}' repeated at positions {1} and {2}",
groups["word"].Value,
groups[0].Index,
groups[1].Index);
}
}
}
// The example produces the following output to the console:
// 3 matches found in:
// The the quick brown fox fox jumped over the lazy dog dog.
// 'The' repeated at positions 0 and 4
// 'fox' repeated at positions 20 and 25
// 'dog' repeated at positions 50 and 54
[^\\t] + \t | "[^"] + "\t
использование Regex определенно похоже на лучший выбор, однако этот просто возвращает целую строку. Я пытаюсь настроить его, но не много удачи до сих пор.
string[] tokens = System.Text.RegularExpressions.Regex.Split(this.BuildArgs, @"[^\t]+\t|""[^""]+""\t");