2011-05-21 51 views
1

我刚开始在C#应用程序上工作。我需要将一个字符串分解成不同的部分。有没有简单的方法来使用C#模式来做到这一点?我认为我可以用子字符串来完成,但它可能会变得混乱,我想做一些容易理解的事情。以下是一个输入示例:如何在C#中将字符串解析为不同的字符串?

AB-CDE-GHI-123-45-67-7777 

variable1 = "AB-CDE-GHI" 
variable2 = "123" 
variable3 = "45" 
variable4 = "67" 
variable5 = "67-7777" 

AB-CDE-GHIJKLM-123-45-67-7777 

variable1 = "AB-CDE-GHIJKLM" 
variable2 = "123" 
variable3 = "45" 
variable4 = "67" 
variable5 = "67-7777" 

AB-123-45-67-7777 

variable1 = "AB" 
variable2 = "123" 
variable3 = "45" 
variable4 = "67" 
variable5 = "67-7777" 

直到“123-45-67-7777”的字符串的第一部分可以是任意长度。对我来说幸运的是,最后一部分123-45-67-7777总是长度相同,并且包含零填充的数字。

我希望有人能提出一些使用正则表达式或其他方法的简单方法的建议。

输入行是这样的:

aa-123-45-67-7777 
HJHJH-123-45-67-7777 
H-H-H--123-45-67-7777 
222-123-45-67-7777 
+0

请准确。你有' - '之间的固定数量的项目,还是你有固定宽度的字符? – 2011-05-21 12:43:12

+0

变量4在变量5中重复。是故意的吗? – Kobi 2011-05-21 12:44:32

+0

也请澄清所需的输出。 – Oded 2011-05-21 12:50:20

回答

1

你不需要RegEx解析这种投入。

您可以使用string.Split,特别是如果输入是高度结构化的。

如果您第一次拆分-,您将得到一个string[],其中每个部件位于阵列的不同索引中。

该数组的长度属性将告诉你有多少部分,你可以使用它来重建你需要的部分。

您可以重新加入您需要的任何位。

string[] parts = "AB-CDE-GHI-123-45-67-7777".split('-'); 

// joining together the first 3 items: 
string letters = string.Format("{0}-{1}-{2}", parts[0], parts[1], parts[2]); 

// letters = "AB-CDE-GHI" 

如果段的数量是可变的(除了最后4),你可以使用length在循环重建希望部分:

StringBuilder sb = new StringBuilder(); 
for(int i = 0; i < parts.Length - 4; i++) 
{ 
    sb.FormatAppend("{0}-", parts[i]); 
} 
sb.Length = sb.Length - 1; // remove trailing - 
+0

我认为他想用' - '来分割变量1 =“foo”作为分割结果 – Yaur 2011-05-21 12:33:26

+0

我不认为_input_包含'=' – 2011-05-21 12:34:17

+0

@亨克 - 我明白了。我错误阅读整个代码块作为一个单一的输入字符串:) – Oded 2011-05-21 12:34:55

0

像奥德说,你可以使用字符串.Split

编辑我的回答像你想

 string[] tab = textBox1.Text.Split('-'); 
     int length = tab.Length; 
     string var1 = string.Empty; 
     for(int i=0; i <= length-5 ; i++) 
     { 
      var1 = var1 + tab[i] + '-'; 
     } 
     var1 = var1.Remove(var1.Length-1,1); 
     string var2 = tab[length-4]; 
     string var3 = tab[length-3]; 
     string var4 = tab[length-2]; 
     string var5 = tab[length-2] + '-' + tab[length-1]; 

它是相同的与@Govind KamalaPrakash马尔维亚的答案只是你必须让VAR1 + TAB [I]

+0

是的,但第一部分是完全可变的。这可能是之前的任何东西-123-45-67-7777 – Alison 2011-05-21 12:41:29

+0

我已编辑我的答案,我做了测试,它的工作......如果您有任何疑问说或选择正确的答案 – Akrem 2011-05-21 13:05:41

0

虽然可以在这里使用String.Split,更好的解决方案,在我看来,是来标记输入,然后解析它。

您可以使用诸如ANTLR之类的工具来达到此目的。

+1

这将工作正常,但isn在这种情况下,ANTLR有没有一把大锤可以打碎核桃? – 2011-05-21 12:48:41

0
string[] str = "AB-CDE-GHI-123-45-67-7777".Split('-') 

int a = str.Length; 

variable1=""; 

for(int i=0;i=<a-5;i++) 
{ 
variable1=str[i]+"-"+variable1; 
} 
// last - remove 
variable1 = variable1.Remove(variable1.Length-1,1); 

variable2 = str[a-4] 
variable3 = str[a-3] 
variable4 = str[a-2] 
variable5 = str[a-2]+"-"str[a-1]; 
1

如果最后一部分是始终已知长度(14个字符),你可能只是做这样的事情:

var firstPart = inputLine.Substring(inputLine.Length - 14); 
var secondPart = inputLine.Substring(0, inputLine.Length - 15); // 15 to exclude the last - 

然后,你可以做你的字符串分割和完成工作:)

+0

似乎最好的方法,特别是考虑到“幸运对我来说,最后[...]永远是相同的长度”。你只需要拆分第二部分,但这应该很容易。 – Kobi 2011-05-21 12:55:45

+0

我喜欢人们总是想办法解决简单问题的复杂解决方案:) – 2011-05-21 13:07:41