Я пытаюсь написать что-то, что форматирует бразильские телефонные номера, но я хочу, чтобы оно совпадало с концом строки, а не с начала, поэтому входные строки были бы повернуты по следующей схеме:
"5135554444" -> "(51) 3555-4444"
"35554444" -> "3555-4444"
"5554444" -> "555-4444"
Поскольку начальная часть - это то, что обычно изменяется, я подумал о построении соответствия с использованием знака $, чтобы оно начиналось в конце, а затем перехватывало назад (как я думал), заменяя затем желаемым конечным форматом и после , просто избавившись от парентези "()" впереди, если они были пусты.
Это код C #:
s = "5135554444";
string str = Regex.Replace(s, @"\D", ""); //Get rid of non digits, if any
str = Regex.Replace(str, @"(\d{0,2})(\d{0,4})(\d{1,4})$", "($1) $2-$3");
return Regex.Replace(str, @"^\(\) ", ""); //Get rid of empty () at the beginning
Возвращаемое значение было ожидаемым для 10-значного числа. Но для чего-то меньшего, это закончилось странным поведением. Это были мои результаты:
"5135554444" -> "(51) 3555-4444"
"35554444" -> "(35) 5544-44"
"5554444" -> "(55) 5444-4"
Кажется, что он игнорирует $ в конце для сопоставления, за исключением того, что если я проверяю что-то менее чем из 7 цифр, это выглядит так:
"554444" -> "(55) 444-4"
"54444" -> "(54) 44-4"
"4444" -> "(44) 4-4"
Обратите внимание, что он сохраняет «минимальное» число {n} раз, когда третья группа захвата всегда захватывает его с конца, но затем первые две группы захватывают с самого начала, как если бы последняя группа не была жадной из конец, просто получение минимума ... странно или это я?
Теперь, если я изменю шаблон, поэтому вместо {1,4} на третьем снимке я использую {4}, это результаты:
str = Regex.Replace(str, @"(\d{0,2})(\d{0,4})(\d{4})$", "($1) $2-$3");
"5135554444" -> "(51) 3555-4444" //As expected
"35554444" -> "(35) 55-4444" //The last four are as expected, but "35" as $1?
"54444" -> "(5) -4444" //Again "4444" in $3, why nothing in $2 and "5" in $1?
Я знаю, что это, вероятно, некоторая моя глупость, но не будет ли разумнее, если я захочу захватить в конце строки, что все предыдущие группы захвата будут захвачены в обратном порядке?
Я бы подумал, что "54444" превратится в "5-4444" в этом последнем примере ... тогда это не ...
Как можно это сделать?
(Я знаю, может быть, есть лучший способ сделать то же самое, используя разные подходы ... но мне действительно интересно узнать, почему это специфическое поведение регулярного выражения кажется странным. Итак, ответ на этот вопрос Вопрос должен быть сосредоточен на объяснении, почему последний захват фиксируется в конце строки, а почему нет, как продемонстрировано в этом примере. Поэтому меня не особо интересует реальная проблема с форматированием # телефона, но чтобы понять Регулярное выражение синтаксис) ...
Спасибо ...