public ParseResultCollection Parse(int startIndex) { string _text = context.Text; ParserPattern _pattern = context.Pattern; int k = startIndex; char ch; StringBuilder sb = new StringBuilder(10); ParseResultCollection prc = new ParseResultCollection(); if (_text[startIndex] == ' ' || _text[startIndex] == ' ') return prc; int braceStartPos = -1; while (k < _text.Length) { ch = _text[k]; if (!IsAllowedChar(ch,_pattern)) break; if (ch >= '0' && ch <= '9') ch = (char)(ch - '0' + '0'); if (ch == ' ') { ch = ' '; } else if (ch == '(') ch = '('; else if (ch == ')') ch = ')'; else if (ch == '-' || ch == '—') ch = '-'; if (ch == '(') braceStartPos = k; else if (ch == ')') braceStartPos = -1; sb.Append(ch); k++; } string allowedString = sb.ToString().TrimEnd(); if (braceStartPos >= 0) { allowedString = allowedString.Substring(0, braceStartPos); } if (allowedString.Length<3||allowedString.Length==4) return prc; bool bNumberInBrace = false; bool bCountryCodeStarted = false; bool bAreaCodeStarted = false; bool bExtStarted = false; int i = 0; StringBuilder segment = new StringBuilder(); StringBuilder whole = new StringBuilder(); PhoneNo phone = new PhoneNo(); if (_pattern == ParserPattern.China) { while (i < allowedString.Length) { ch = allowedString[i]; if (ch == '(') { bNumberInBrace = true; bCountryCodeStarted = false; whole.Append(ch); } else if (NumeralUtil.IsArabicNumeral(ch)) { if (segment.Length == 0 && !bAreaCodeStarted && phone.AreaCode == null && !bCountryCodeStarted) bAreaCodeStarted = true; segment.Append(ch); whole.Append(ch); } else if (ch == ')' && bNumberInBrace) { if (bCountryCodeStarted) { if (segment.Length > 0) phone.CountryCode = segment.ToString(); bCountryCodeStarted = false; } if (bAreaCodeStarted) { if (segment.Length > 0 && (segment[0] == '0' ? segment.Length <= 4 : segment.Length <= 3)) //城市代码以0开头,最多4个数字;不以0开头,三个数字 phone.AreaCode = segment.ToString(); bAreaCodeStarted = false; } whole.Append(ch); segment = new StringBuilder(); bNumberInBrace = false; } else if (ch == ' ') { if (bCountryCodeStarted) { if (segment.Length > 0) phone.CountryCode = segment.ToString(); bCountryCodeStarted = false; } else if (bAreaCodeStarted) { if (segment.Length > 0) phone.AreaCode = segment.ToString(); bAreaCodeStarted = false; } else if (segment.Length > 0) { AssignPhoneMain(segment, phone); } segment = new StringBuilder(); bCountryCodeStarted = false; whole.Append(ch); } else if (ch == '-' || ch == '#') { if (segment[0] == '0' && (segment.Length == 3 || segment.Length == 4)) { phone.AreaCode = segment.ToString(); }else if (segment.Length > 0) { AssignPhoneMain(segment, phone); bExtStarted = true; } segment = new StringBuilder(); whole.Append(ch); } else if (ch == '+') { whole.Append(ch); bCountryCodeStarted = true; } i++; } if (segment.Length > 0) { AssignPhoneMain(segment, phone); if (bExtStarted) { phone.Extension = segment.ToString(); bExtStarted = false; } } } else if (_pattern == ParserPattern.NorthAmerica) { while (i < allowedString.Length) { ch = allowedString[i]; if (NumeralUtil.IsArabicNumeral(ch)) { whole.Append(ch); segment.Append(ch); } else if (ch == ' ') { whole.Append(ch); } else if (ch == '(') { bAreaCodeStarted = true; whole.Append(ch); } else if (ch == ')') { if (bAreaCodeStarted) { if (segment.Length > 0) phone.AreaCode = segment.ToString(); bAreaCodeStarted = false; } segment = new StringBuilder(); whole.Append(ch); } else if (ch == '-') { if (bCountryCodeStarted) { if (segment.Length > 0) phone.CountryCode = segment.ToString(); bCountryCodeStarted = false; bAreaCodeStarted = true; } else if (bAreaCodeStarted) { if (segment.Length > 0) phone.AreaCode = segment.ToString(); bAreaCodeStarted = false; } else if (segment.Length > 0) { AssignPhoneMain(segment, phone); } whole.Append(ch); segment = new StringBuilder(); } else if (ch == '+') { bCountryCodeStarted = true; whole.Append(ch); } else if (ch == '.') { if (segment.ToString() != "ext") break; whole.Append("ext."); } else if (ch == 'e' || ch == 'x' || ch == 't') { segment.Append(ch); } i++; } if (segment.Length > 0) { AssignPhoneMain(segment, phone); if (bExtStarted) { phone.Extension = segment.ToString(); bExtStarted = false; } } } else { throw new NotImplementedException("Phone No. in "+_pattern.ToString()+" is not implemented in the parser."); } if (whole.Length > 0 && phone.Main!=null) { prc.Add(ParseResult.Create(whole.ToString(), startIndex, POSType.A_M, phone)); } return prc; }
void AssignPhoneMain(StringBuilder segment, PhoneNo phone) { ParserPattern _pattern = context.Pattern; char separator = ' '; int bSeparatorLen = 0; if (_pattern == ParserPattern.NorthAmerica) { separator = '-'; } if (phone.Main == null) { phone.Main = segment.ToString(); } else if (phone.Main.Length < 5) { phone.Main += separator + segment.ToString(); bSeparatorLen = 1; } if (IsMobileNo(phone.Main, _pattern)) { phone.IsMobile = true; } else { //非手机号码,8位 if (_pattern == ParserPattern.China && phone.Main.Length > 8 + bSeparatorLen) { phone.Main = null; } } }