2010-01-20 17 views
3

请帮我解决这个问题。 我想将“-action = 1”分成“action”和“1”。帮我使用正则表达式分割字符串

string pattern = @"^-(\S+)=(\S+)$"; 
Regex regex = new Regex(pattern); 
string myText = "-action=1"; 
string[] result = regex.Split(myText); 

我不知道为什么结果长度= 4。

result[0] = "" 
result[1] = "action" 
result[2] = "1" 
result[3] = "" 

请帮帮我。

P/S:我正在使用.NET 2.0。

谢谢。

你好,我用字符串测试:@“ - destination = C:\ Program Files \ Release”但它有不准确的结果,我不明白为什么结果的长度= 1。我认为,因为它有一个空白区域串。

我想要拆分为 “目的地” & “C:\ Program Files文件\发布”

更多信息:这是我的要求: -string1 =字符串2 - >它拆分:字符串1 &字符串2。 在string1中& string2不包含字符:' - ','=',但它们可以包含空格。

请帮帮我。谢谢。

+0

你好,我用绳子测试:@“ - 目的地= C:\ Program Files文件\发布”,但它有不准确的结果,我不明白为什么结果的长度= 1,我想是因为它有一个字符串中的空白区域。 我想分割它到“目的地”和“C:\ Program Files文件\释放” 请帮助我。谢谢。 –

回答

3

试试这个(更新添加Regex.Split):

string victim = "-action=1"; 
string[] stringSplit = victim.Split("-=".ToCharArray()); 
string[] regexSplit = Regex.Split(victim, "[-=]"); 

编辑:使用你的例子:

string input = @"-destination=C:\Program Files\Release -action=value"; 
foreach(Match match in Regex.Matches(input, @"-(?<name>\w+)=(?<value>[^=-]*)")) 
{ 
    Console.WriteLine("{0}", match.Value); 
    Console.WriteLine("\tname = {0}", match.Groups["name" ].Value); 
    Console.WriteLine("\tvalue = {0}", match.Groups["value"].Value); 
} 
Console.ReadLine(); 

当然,这段代码有问题,如果你的路径包含-字符

0

使用string.split()有什么问题?

string test = "-action=1"; 
string[] splitUp = test.Split("-=".ToCharArray()); 

我承认,但是这仍然给你可能更多的参数比你想的分裂数组中看到...

[0] = "" 
[1] = "action" 
[2] = "1" 
+0

怎么了?你不需要免费的输入验证,它可以处理不同的事情(想象一下'-range = 1-2')。 – Lucero

+0

已授予,但使用RegEx,您不会获得任何*任何*免费,并且正如OP所见,构建适当的正则表达式字符串并不是一项简单的任务。我只是建议一个合理可行的替代方案,它不依赖于了解未知(请参阅OP的编辑) – ZombieSheep

5

不要使用分割,只需要使用Match ,然后按索引(索引1和索引2)从Groups集合中获得结果。

Match match = regex.Match(myText); 
if (!match.Success) { 
    // the regex didn't match - you can do error handling here 
} 
string action = match.Groups[1].Value; 
string number = match.Groups[2].Value; 
+0

您绝对不应该在.NET正则表达式中按索引使用组......您可以将组命名为某个原因。想象一下,如果有人稍后通过添加另一组括号稍微改变了正则表达式。那么你不得不改变你所有的索引。 - 改用组名。 –

+0

我只使用非常简单的情况下的索引,如这个(只有一个或两个捕获,没有嵌套组等)。否则,我同意使用名称可以使正则表达式更健壮,更易于理解。 – Lucero

+0

你好,我用字符串测试:@“ - destination = C:\ Program Files \ Release”但它有不准确的结果。我想是因为它有一个字符串的空白区域。 我想将它拆分为“目的地”和“C:\ Program Files \ Release” –

3

在.NET Regex中,你可以命名你的组。

string pattern = @"^-(?<MyKey>\S+)=(?<MyValue>\S+)$"; 
Regex regex = new Regex(pattern); 
string myText = "-action=1"; 

然后做一个“匹配”,并获取您的组名称的值。

Match theMatch = regex.Match(myText); 
if (theMatch.Success) 
{ 
    Console.Write(theMatch.Groups["MyKey"].Value); // This is "action" 
    Console.Write(theMatch.Groups["MyValue"].Value); // This is "1" 
} 
相关问题