C # - проблема с расщеплением строки - PullRequest
1 голос
/ 21 сентября 2009

У меня есть набор значений, на основе которого я разбил строку

string[] seperator = new string[9];
        seperator[0] = "*";  //is the client
        seperator[1] = "/";  //is the name of company
        seperator[2] = "(";     //name of the market    
        seperator[5] = ":";    //ID
        seperator[6] = "?";    //orderType
        seperator[3] = "!@";   //realtive Time
        seperator[4] = "!+";   //
        seperator[7] = "+";    //quantity
        seperator[8] = "@";//price
string[] result = values.Split(seperator, StringSplitOptions.None);

Например: строка ввода * A / AB (M @ 12:!?! 6 SIMPLE + 5 + 2

OUTPUT
    [0]: ""
    [1]: "A"
    [2]: "AB"
    [3]: "M"
    [4]: "12"
    [5]: "6"
    [6]: "SIMPLE"
    [7]: "5"
    [8]: "2"

Например: строка ввода ! * A (M @ 12 SIMPLE + 5 + 2 / AB:! 6

OUTPUT:
    [0]: ""
    [1]: "A"
    [2]: "M"
    [3]: "12"
    [4]: "SIMPLE"
    [5]: "5"
    [6]: "2"
    [7]: "AB"
    [8]: "6"

Проблема, с которой я сталкиваюсь, заключается в следующем: как я могу определить, что А - это клиент, АБ - это компания ... и т. Д.

как порядок, в котором пользователь может ввести эту информацию СЛУЧАЙНО ... Если он не вводит ни одно из этих значений, это меняет длину результата?

Ответы [ 3 ]

5 голосов
/ 21 сентября 2009

Как насчет использования одного или нескольких регулярных выражений с именованными группами захвата и индексации совпадений по имени?

Проверьте, например, эту страницу MSDN или это сообщение .

Вот пример для начала:

using System;
using System.Text.RegularExpressions;

class Program {
    static void Main(string[] args) {

        Regex regex = new Regex(@"(?:\*(?<client>\w+))|(?:/(?<company>\w+))",RegexOptions.Compiled);
        string input = "*A/AB(M!@12:6?SIMPLE!+5+2";

        foreach (Match match in regex.Matches (input)) {
            if (match.Groups["client"].Success) {
                Console.WriteLine("Client = {0}", match.Groups["client"].Value);
            } else if (match.Groups["company"].Success) {
                Console.WriteLine("Company = {0}", match.Groups["company"].Value);
            }
        }


    }
}

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

Кроме того, есть некоторые инструменты, которые позволяют вам экспериментировать и помогать вам писать регулярные выражения, такие как Expresso и The Regulator .

3 голосов
/ 21 сентября 2009

Как насчет выполнения ряда замен для входной строки, чтобы получить ее в более управляемом формате. Например.

inputString = inputString.Replace("*", ",Client=").Replace("/", ",Company=");

Затем вы можете разделить на "," и получить список строк с их заголовками, а затем разделить их на "=", чтобы получить заголовок и значение.

1 голос
/ 21 сентября 2009

Используя что-то вроде этого

SortedList<int, string> list = new SortedList<int, string>();
            string[] seperator = new string[9];
            seperator[0] = "*";  //is the client
            seperator[1] = "/";  //is the name of company
            seperator[2] = "(";     //name of the market    
            seperator[5] = ":";    //ID
            seperator[6] = "?";    //orderType
            seperator[3] = "!@";   //realtive Time
            seperator[4] = "!+";   //
            seperator[7] = "+";    //quantity
            seperator[8] = "@";//price
            string val = "*A/AB(M!@12:6?SIMPLE!+5+2";

            for (int iSep = 0; iSep < seperator.Length; iSep++)
                list.Add(val.IndexOf(seperator[iSep]), val);

выдаст вам список позиций, с которых начинаются разделители, в любом порядке, который вводит пользователь, а затем вы можете использовать подстроку для получения значений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...