c#正则表达式给出错误
问题描述:
我正在使用regex
代码来查找我的windows phone应用程序中的联系人匹配,它工作良好,但有时会出错"Values cannot be null"
。c#正则表达式给出错误
try {
var l = new List<string>();
foreach (var item in listobj)
l.Add(item.FirstName);
var digitMap = new Dictionary<int, string>() {
{ 1, "" },
{ 2, "[abcABC]" },
{ 3, "[defDEF]" },
{ 4, "[ghiGHI]" },
{ 5, "[jklJKL]" },
{ 6, "[mnoMNO]" },
{ 7, "[pqrsPQRS]" },
{ 8, "[tuvTUV]" },
{ 9, "[wxyzWXYZ]" },
{ 0, "" },
};
var enteredDigits = str;
var charsAsInts = enteredDigits.ToCharArray().Select(x => int.Parse(x.ToString()));
var regexBuilder = new StringBuilder();
foreach (var val in charsAsInts)
regexBuilder.Append(digitMap[val]);
var pattern = regexBuilder.ToString();
//append a ".*" to the end of the regex to make it "StartsWith", beginning for "EndsWith", or both for "Contains";
pattern = ".*" + pattern + ".*";
var matchingNames = l.Where(x => Regex.IsMatch(x, pattern));
SearchListbox.ItemsSource = listobj.FindAll(x=>x.PhoneNumbers.Contains(str) | x.FirstName.Contains(matchingNames.FirstOrDefault()));
} catch (Exception e) {
MessageBox.Show(e.Message);
}
我想当没有接触匹配时会抛出一个错误,它也不会显示所有的匹配,直到整个名字匹配。
怎么了?谢谢。
答
如果没有匹配,matchingNames为null,则matchingNames.FirstOrDefault()也为空
所以在这里找你做String.Contains(空)=>异常
你看到了什么?类似的东西:
if (matchingNames == null)
{
//Search just in phoneNumbers
SearchListbox.ItemsSource = listobj.FindAll(x=>x.PhoneNumbers.Contains(str));
}
else
{
//Search both
SearchListbox.ItemsSource = listobj.FindAll(x=>x.PhoneNumbers.Contains(str) | x.FirstName.Contains(matchingNames.FirstOrDefault()));
}
你的第二个问题,尝试将其完全删除matchingNames和L变量:
try {
var digitMap = new Dictionary<int, string>() {
{ 1, "" },
{ 2, "[abcABC]" },
{ 3, "[defDEF]" },
{ 4, "[ghiGHI]" },
{ 5, "[jklJKL]" },
{ 6, "[mnoMNO]" },
{ 7, "[pqrsPQRS]" },
{ 8, "[tuvTUV]" },
{ 9, "[wxyzWXYZ]" },
{ 0, "" },
};
var enteredDigits = str;
var charsAsInts = enteredDigits.ToCharArray().Select(x => int.Parse(x.ToString()));
var regexBuilder = new StringBuilder();
foreach (var val in charsAsInts)
regexBuilder.Append(digitMap[val]);
var pattern = regexBuilder.ToString();
//append a ".*" to the end of the regex to make it "StartsWith", beginning for "EndsWith", or both for "Contains";
pattern = ".*" + pattern + ".*";
SearchListbox.ItemsSource = listobj.FindAll(x=>x.PhoneNumbers.Contains(str) | Regex.isMatch(x.FirstName, pattern));
} catch (Exception e) {
MessageBox.Show(e.Message);
}
+0
请说明你建议解决这个问题。这不是问题的答案。 – kkuilla 2014-10-09 09:50:42
+0
@ Benji_9989解决了我所有的问题:)谢谢 – 2014-10-09 10:37:18
你能告诉我第一取悦你有什么actualy想干什么?这看起来很复杂,对我来说应该很简单 – Vajura 2014-10-09 09:40:44
哪一行会引发异常? – 2014-10-09 09:42:00