2017-06-05 194 views
1

这里我使用了下面提到的代码。用正则表达式分隔字符串并加上分号

MatchCollection matches = Regex.Matches(cellData, @"(^\[.*\]$|^\[.*\]_[0-9]*$)"); 

唯一的这种模式没有做的是它不会将分号和加号从主字符串中分离出来。

样本串

[dbServer];[ciDBNAME];[dbLogin];[dbPasswd] AND [[email protected]]_+[@IterationCount] 

我想从字符串中提取

[dbServer] 
[ciDBNAME] 
[dbLogin] 
[dbPasswd] 
[[email protected]] 
[@IterationCount] 

+0

你确定是这个模式的唯一的问题?请显示一些输入字符串和预期输出。 –

+0

[dbServer]; [ciDBNAME]; [dbLogin]; [dbPasswd] AND [SIM_ErrorFound @ 1] _ + [@ IterationCount] 没有被分割。 –

+0

你的意思是你只是想提取'[...]'子串?尝试像['@“\ [[^] [] +]”'](http://regexstorm.net/tester?p=%5c%5b%5b%5e%5d%5b%5d%2b%图5d与I =%5bdbServer%5D%3B%5bciDBNAME%5D%3B%5bdbLogin%5D%3B%5bdbPasswd%5D + AND +%5bSIM_ErrorFound%401%5d_%2B%5B%40IterationCount%5D)。 –

回答

1

[dbServer];[ciDBNAME];[dbLogin];[dbPasswd] AND [[email protected]]_+[@IterationCount]提取方括号中的东西(这是我认为你可以尝试做),

正则表达式(我没有引用的话)应该是

\[([^\]]*)\]

您不应该使用^$,因为您对字符串的开始和结束不感兴趣。圆括号将捕获方括号内的零个或多个字符的每个实例。 如果您想更具体地了解您在括号中捕获的内容,则需要将[^\]更改为其他内容。

+0

如果OP需要验证字符串呢?这并不会有帮助,锚点将是必要的。 –

+0

@WiktorStribiżew,同意,但我发布的是基于猜测OP是试图做什么,这只是捕获数据库连接字符串参数(一个非常常见的任务)编辑:看起来像OP是满意的在你的评论中的消化:) –

1

你的正则表达式 - (^\[.*\]$|^\[.*\]_[0-9]*$) - 与[开头的完整的字符串匹配,则包含除换行符其他零个或多个字符,并用]\]$)结束或_随后与0+数字(_[0-9]*$)。您也可以将模式编写为^\[.*](?:_[0-9]*)?$,它的工作原理是一样的。

但是,您需要匹配较大字符串内的多个子字符串。因此,您应该已经移除了^$锚点并重试。然后,您会发现.*过于贪婪,从第一个[到最后的]匹配。要解决这个问题,最好使用否定字符类解决方案。例如。您可以使用[^][]*匹配除[]之外的0+个字符。

编辑:看来你只需要得到方括号内的文字。

您需要使用一个捕获组,您需要获取的模式部分周围有一对未转义的括号,然后通过组ID进行访问(未命名组从左至右以1开头) ):

var results = Regex.Matches(s, @"\[([^][]+)]") 
    .Cast<Match>() 
    .Select(m => m.Groups[1].Value) 
    .ToList(); 

.NET regex demo enter image description here

相关问题