예제 #1
0
        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;
        }
예제 #2
0
        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;
                }
            }
        }