in matcher.go [122:173]
func AllNumberGroupsRemainGrouped(
number *PhoneNumber,
normalizedCandidate string,
formattedNumberGroups []string) bool {
var fromIndex = 0
if number.GetCountryCodeSource() != PhoneNumber_FROM_DEFAULT_COUNTRY {
// First skip the country code if the normalized candidate contained it.
var cc = strconv.Itoa(int(number.GetCountryCode()))
fromIndex = strings.Index(normalizedCandidate, cc) + len(cc)
}
// Check each group of consecutive digits are not broken into
// separate groupings in the normalizedCandidate string.
for i := 0; i < len(formattedNumberGroups); i++ {
// Fails if the substring of normalizedCandidate starting
// from fromIndex doesn't contain the consecutive digits
// in formattedNumberGroups[i].
fromIndex = strings.Index(
normalizedCandidate[fromIndex+1:], formattedNumberGroups[i])
if fromIndex < 0 {
return false
}
// Moves fromIndex forward.
fromIndex += len(formattedNumberGroups[i])
if i == 0 && fromIndex < len(normalizedCandidate) {
// We are at the position right after the NDC. We get
// the region used for formatting information based on
// the country code in the phone number, rather than the
// number itself, as we do not need to distinguish between
// different countries with the same country calling code
// and this is faster.
var region = GetRegionCodeForCountryCode(int(number.GetCountryCode()))
if GetNddPrefixForRegion(region, true) != "" &&
unicode.IsDigit(rune(normalizedCandidate[fromIndex])) {
// This means there is no formatting symbol after the
// NDC. In this case, we only accept the number if there
// is no formatting symbol at all in the number, except
// for extensions. This is only important for countries
// with national prefixes.
var nationalSignificantNumber = GetNationalSignificantNumber(number)
return strings.HasPrefix(
normalizedCandidate[fromIndex-len(formattedNumberGroups[i]):],
nationalSignificantNumber)
}
}
}
// The check here makes sure that we haven't mistakenly already
// used the extension to match the last group of the subscriber
// number. Note the extension cannot have formatting in-between digits.
return strings.Contains(normalizedCandidate[fromIndex:], number.GetExtension())
}