Лучший способ проанализировать Пространство Разделенный текст

Вы можете предварительно загрузить изображения

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);
7
задан csharpwinphonexaml 9 September 2015 в 10:19
поделиться

6 ответов

Компьютерный термин для того, что Вы делаете, является лексическим анализом; считайте это для хорошей сводки этой общей задачи.

На основе Вашего примера я предполагаю, что Вы хотите, чтобы пробел разделил Ваши слова, но материал в кавычках нужно рассматривать как "слово" без кавычек.

Самый простой способ сделать это должно определить слово как регулярное выражение:

([^"^\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: ответ Желания, выше, является той же идеей как этот. Надо надеяться, этот ответ объясняет детали позади сцены немного лучше :)

16
ответ дан 6 December 2019 в 07:30
поделиться

Microsoft. VisualBasic. Пространство имен FileIO (в Microsoft.VisualBasic.dll) имеет TextFieldParser, который можно использовать для разделения на разграниченном тексте пространства. Это обрабатывает строки в кавычках (т.е. "это - один маркер" thisistokentwo), хорошо.

Отметьте, просто потому что DLL говорит, что VisualBasic не подразумевает, что можно только использовать его в проекте VB. Его часть всей Платформы.

7
ответ дан 6 December 2019 в 07:30
поделиться

Craig прав — используют регулярные выражения. Regex. Разделение может быть более кратким для Ваших потребностей.

-1
ответ дан 6 December 2019 в 07:30
поделиться

Существует подход конечного автомата.

    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

3
ответ дан 6 December 2019 в 07:30
поделиться

Вы также могли бы хотеть изучить регулярные выражения. Это могло бы выручить Вас. Вот образец, сорванный из 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
0
ответ дан 6 December 2019 в 07:30
поделиться

[^\\t] + \t | "[^"] + "\t

использование Regex определенно похоже на лучший выбор, однако этот просто возвращает целую строку. Я пытаюсь настроить его, но не много удачи до сих пор.

string[] tokens = System.Text.RegularExpressions.Regex.Split(this.BuildArgs, @"[^\t]+\t|""[^""]+""\t");
-1
ответ дан 6 December 2019 в 07:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: