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

本文关键字:模式 拆分 字符串 正则表达式 | 更新日期: 2023-09-27 18:09:56

我有一个字符串,我想把它分割成

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);

但是不能用regex更有效地完成吗?我遇到过这样的模式,需要分成两部分。

 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;
到目前为止,我已经到了这里。但是我觉得我用的方法不对。请给我指路。

EDIT:我想按图案编辑。不能使用破折号分割,因为分割的第一部分包含破折号。例如,"2012-0001"

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

我就这样写:

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

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

使用复杂的正则表达式或扩展方法是非常迅速的;有时候简单的方法本身就足够有效了。

我同意其他人的看法,使用子字符串是比正则表达式更好的解决方案。但是,如果你坚持使用正则表达式,你可以使用:

^('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文档:正则表达式。拆分方法类似于String。拆分方法,除了Regex。Split按正则表达式确定的分隔符(而不是一组字符)分隔字符串。

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

如果你有一些新来者能理解的东西,将来维护起来会更容易。

你可以使用:

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;