2013-04-18 73 views
-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; 

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

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

+2

我不是一个C#的家伙,但它有一个'分裂'功能像Javascript?然后你可以只用'finalQuote.split(“ - ”)[1]'并获得你的'0001'值。 – Shaded

+7

正则表达式几乎不知道它的效率。 –

+2

如果您有固定数量的字符,最好使用您的子字符串方法。 –

回答

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和将是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(?=)

+0

+1。那一线是辉煌的。这个对我有用。你能解释一下吗?我不太了解。 – naveen

+0

@naveen查看我更新的答案。 – rvalvik

4

我会简单地去:

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

quoteNum将包括前9个字符,而10日的revision,一切都可以跟随10日,如如果修订版本是10或更高版本,它仍然可以工作。

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

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; 
+0

谢谢,我明白了。这是寻找的东西。你可能想改变这样的代码,对吧? 'var quoteNum = m.Groups [1] .Value; var revision = m.Groups [2] .Value;'as'Groups [0] .value'返回传递的字符串本身。我真的希望学习和你的代码为我工作出色。再次感谢 – naveen

+0

我本来希望标记你的答案太:)再次感谢.... – naveen