通过拆分字符串c#

时间:2018-09-12 12:57:55

标签: c# web-services

我正在使用Tesseract Ocr 3.02为应用程序提供Web服务。
我想根据名片上获得的信息数量创建变量,然后根据字符串中的信息对它们进行分类。 例如:

  

电话。 + 496123456789 $ Mobil +49123456789$kai.kalsbach@gmail.com$www.google.com$Kai Kalsbach $ Muster Str 1a $ 40599Düsseldorf$“

然后这样:

-电话号码

-名

-姓氏

-电子邮件

-地址

那是我的第一个主意:

string endText1 = text.Split('$')[0];
string endText2 = text.Split('$')[1];
string endText3 = text.Split('$')[2];
string endText4 = text.Split('$')[3];
string endText5 = text.Split('$')[4];
string endText6 = text.Split('$')[5];
string endText7 = text.Split('$')[6];
string endText8 = text.Split('$')[7];

然后我将对变量进行分类。

但是在许多情况下,我会遇到以下异常,因为信息数量可能会因名片而异。

  

System.IndexOutOfRangeException:索引在数组c#的范围之外

7 个答案:

答案 0 :(得分:0)

string[] Splitted = text.Split('$');

您提到您要根据拆分中吐出的元素数量做出决定

int Count = Splitted.Length;
switch(Count)
{ case 0: //DoStuff
         break;
 ....
  default:
          break;
}

答案 1 :(得分:0)

对于您而言,最好使用以下内容:

string[] stringList = text.Split('$');

foreach(string val in stringList)
{
  //your logic.
}

答案 2 :(得分:0)

您可以使用.Split方法将字符串拆分一次。 然后在foreach或for循环中运行它。我相信您的逻辑基于字符串的数量,因此您正在寻找“ for”循环。

string[] split = text.Split('$');

for (int i = 0; i < split.Length; i++)
{
    var text = split[i];
    // Your logic here... 

    switch (i) // for logic based on the index of the string
    {
        case 0:
        // do something
        break;
        case 1:
        // do something
        break;
    }

}

答案 3 :(得分:0)

抛出IndexOutOfRangeException异常是因为代码试图访问7项数组中的第8项:

string endText8 = text.Split('$')[7];

.NET集合中的索引基于0,这意味着7表示第8个元素。

默认情况下,String.Split也将返回空字段。这意味着该字符串与此处发布的字符串不同,或者使用了StringSplitOptions.RemoveEmptyEntries

String.Split返回可以存储在string[]变量中的字符串数组。无需重复 String.Split或使用多个变量:

var items = text.Split(new[]{'$'},StringSplitOptions.RemoveEmptyEntries);

从此数组创建类非常简单,您可能无需创建自定义解析器:

class Record 
{
    public string Telephone {get;set;}
    ...
}


var items = text.Split('$');
var record=new Record 
           {
               Telephone=items[0],
               Mobile=items[1],
               ...
           };

答案 4 :(得分:0)

抛出IndexOutOfRangeException异常是因为代码试图访问数组长度之外的项。

我的主张:我创建的formattedArray总是包含8个项目,然后将拆分后的数组复制到此formattedArray。这样一来,您再也没有IndexOutOfRangeException了,因为text.Split('$')中缺少的项目在formattedArray中为空

var a = text.Split('$');
var formattedArray = new string[8];
Array.Copy(a, formattedArray, a.Length);



string endText1 = formattedArray [0];
string endText2 = formattedArray [1];
string endText3 = formattedArray [2];
string endText4 = formattedArray [3];
string endText5 = formattedArray [4];
string endText6 = formattedArray [5];
string endText7 = formattedArray [6];
string endText8 = formattedArray [7];

答案 5 :(得分:0)

另一种简便的方法是尝试,然后将创建所有变量,直到索引达到最大值。

    string[] strArray = text.Split('$');

    Try {
            string endText1 = strArray[0];
            string endText2 = strArray[1];
            string endText3 = strArray[2];
            string endText4 = strArray[3];
            string endText5 = strArray[4];
            string endText6 = strArray[5];
            string endText7 = strArray[6];
            string endText8 = strArray[7];
         } 
    catch 
         {
            //nothing
         }

答案 6 :(得分:0)

创建工厂和识别器

<!DOCTYPE html>
<html>
<body>

<canvas id="myCanvas" width="263" height="442" style="border:1px solid #d3d3d3;">
Your browser does not support the HTML5 canvas tag.</canvas>

<script>

var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");

// Red rectangle
ctx.beginPath();
ctx.lineWidth = "6";
ctx.strokeStyle = "red";
ctx.rect(200, 400 , 40, 40);  
ctx.stroke();

// Green rectangle
ctx.beginPath();
ctx.lineWidth = "4";
ctx.strokeStyle = "green";
ctx.rect(30, 30, 50, 50);
ctx.stroke();

// Blue rectangle
ctx.beginPath();
ctx.lineWidth = "10";
ctx.strokeStyle = "blue";
ctx.rect(50, 50, 150, 80);
ctx.stroke();
</script> 

</body>
</html>

将字符串分割成段

public class PhoneItem : IItem
{
    public PhoneItem(string text)
    {
        // some code
    }
}

public interface IRecognizer
{
    IItem Recognize(int index, string text);
}

public class PhoneRecognizer : IRecognizer
{
    public IItem Recognize(int index, string text)
    {
        return index == 0 ? new PhoneItem(text) : null;
    }
}

public class ItemFactory
{
    private IEnumerable<IRecognizer> _recognizers = new [] 
    {
        new PhoneRecognizer(),
        new FullNameRecognizer()
    };

    public IItem CreateItem(int index, string text)
    {
        foreach (var rec in _recognizers)
        {
            var item = rec.Recognize(index, text);
            if (item != null)
            {
                return item;
            }
        }
        throw new Exception("Item not recognized");
    }
}

使用工厂创建对象

var parts = text.Split('$');