-5

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

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;

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

编辑:我想按模式编辑。用破折号分割不是一个选项,因为分割的第一部分包含一个破折号。IE,"2012-0001"

4

3 回答 3

4

我会简单地选择:

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

quoteNum将由前 9 个字符、第 10 个字符和第 10 个字符之后revision的所有字符组成,例如,如果修订版是 10 或更高,它仍然可以工作。

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

于 2013-04-18T13:42:01.753 回答
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]将是quoteNum并且data[1]将是revision


更新:

的解释Regex.Split

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

正则表达式-(?=\d$)匹配一个-给定的后跟它,a digit followed by the end of the string因此它只会匹配字符串中的最后一个破折号。最后一个数字没有被消耗,因为我们使用了零宽度的前瞻断言 (?=)

于 2013-04-18T13:55:42.197 回答
1

s如果新人能理解的东西,以后维护起来会更容易。

你可以使用:

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

但是,如果您坚持需要一个正则表达式,那么

(\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;
于 2013-04-18T14:02:17.913 回答