想使用正则表达式模式拆分字符串

时间:2013-04-18 13:32:27

标签: c# regex

我有一个字符串,我想分成

var finalQuote = "2012-0001-1";
var quoteNum = "2012-0001";
var revision = "1"

我使用过这样的东西

var quoteNum = quoteNum.subString(0,9);
var revision = quoteNum.subString(quoteNum.lastIndexOf("-") + 1);

但是不能更有效地使用正则表达式吗?我遇到这样的模式,需要分成两部分。

 var finalQuote = "2012-0001-1";
 string pat = @"(\d|[A-Z]){4}-\d{4}";
 Regex r = new Regex(pat, RegexOptions.IgnoreCase);
 Match m = r.Match(text);
 var quoteNum = m.Value;

到目前为止,我已到达此处。但我觉得我没有使用正确的方法。请指导我。

编辑:我想通过模式进行编辑。由于拆分的第一部分包含破折号,因此不能使用破折号拆分。即,"2012-0001"

3 个答案:

答案 0 :(得分:4)

我会简单地选择:

var quoteNum = finalQuote.Substring(0,9);
var revision = finalQuote.Substring(10);

quoteNum将包含前9个字符,以及10日的revision以及可能在10日之后的所有内容,例如如果修订版为10或更高版本,它仍然有效。

使用复杂的正则表达式或扩展方法很快就会过度杀伤;有时简单的方法本身就足够有效。

答案 1 :(得分:1)

我同意其他人的观点,使用子字符串比正则表达式更好。 但是如果你坚持使用正则表达式,你可以使用类似的东西:

^(\d{4}-\d{4})-(\d)$

未经测试,因为我没有安装C#环境:

var finalQuote = "2012-0001-1";
string pat = @"^(\d{4}-\d{4})-(\d)$";
Regex r = new Regex(pat);
Match m = r.Match(finalQuote);
var quoteNum = m.Groups[1].Value;
var revision = m.Groups[2].Value;

或者,如果您想要string[],您可以尝试(再次,未经测试):

string[] data = Regex.Split("2012-0001-1",@"-(?=\d$)");

data[0]quoteNumdata[1]revision


更新

Regex.Split的解释:

来自Regex.Split文档: Regex.Split方法与String.Split方法类似,不同之处在于Regex.Split将字符串拆分为由正则表达式而不是一组正则表达式确定的分隔符字符。

正则表达式-(?=\d$)匹配单个-,因为它后跟a digit followed by the end of the string,因此它只匹配字符串中的最后一个短划线。由于我们使用zero-width lookahead assertion (?=)

,因此不会使用最后一位数字

答案 2 :(得分:1)

如果你有新人可以理解的话,将来会更容易维护。

你可以使用:

var finalQuote = "2012-0001-1";
string[] parts = finalQuote.Split("-");
var quoteNum = parts[0] + "-" + parts[1] ;
var revision = parts[3];

但是,如果你坚持要求regEx,那么

(\d{4}-\d{4})-(\d)

此表达式中有两个组,第1组捕获第一部分,第2组捕获第二部分。

var finalQuote = "2012-0001-1";
string pat = @"(\d{4}-\d{4})-(\d)";
Regex r = new Regex(pat, RegexOptions.IgnoreCase);
Match m = r.Match(finalQuote);
var quoteNum = m.Groups[1].Value;
var revision = m.Groups[2].Value;