想要使用正则表达式模式拆分字符串
本文关键字:模式 拆分 字符串 正则表达式 | 更新日期: 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;