More RegEx confusion with telephone numbers

Hi all,

I have been asked to convert the UK telephones stored in AD in the E164 standard to the +44(0) XXX XXX XXX format by the business (which a lot of people do not like - not my decision).

As I do not know what the telephone numbers will be, but know the pattern, I thought this would be perfect for RegEx however am again struggling to get it to work.

The first issue is one of error checking.

I have created this RegEX expression to detect both formats:

#Example Format required by business
$a = "+44(0)1202 204 746"
#Example in E164 format
$b = "+441202204746"
#RegEx for $a
$a -match "^\+[44]*[(0)]*\d{4}\s*\d{3}\s*\d{3}$"
#RegEx for $b
$b -match "^\+[44][0-9]*$"

Unfortunately if I run the RegEx for $a on $b it will still come back true, so I cannot be sure that the number is in the correct format. How do I ensure the RegEx returns false if there are no spaces and (0) in the number?

The second one is how to alter the number. I have tried the following two methods, but neither are working. What am I doing wrong?

$a = "+441202204746"
$a -replace "(^\+[44]*[(0)]*\d{4}\s*\d{3}\s*\d{3}$)", '$a'

$a = "4412022047"
$b = "{0:(###) ###-####}" -f $a

Thanks in advance for any pointers you can give me :slight_smile:

In regex, square brackets create a character class, a set of characters that will be matched in a single position of the input string (unless you add a quantifier, such as + or * or {3} which tells it to match the character class a different number of times.)

If you don’t actually care what format the phone number was originally in, and just want to make sure it’s matching the “+44(0)1202 204 746” format, then this should work with a single pattern:

$numbers = @(
    '+44(0)1202 204 746'
    '+4412345678901' # Deliberately has too many digits to test validation

$pattern = '^\+44(?:\(0\))?(\d{4})\s*(\d{3})\s*(\d{3})$'

foreach ($number in $numbers)
    if ($number -match $pattern)
        '+44(0){0} {1} {2}' -f $matches[1], $matches[2], $matches[3]
        Write-Error "Number '$number' is not a valid UK telephone number."

Hi Dave,

Thanks for your reply. To make things easier, we are just going to check the telephone attribute currently in AD is in E164 format by using this RegEx (basically has a + and 12 digits with no spaces)

$b -match "^\+?\d{12}$" 

and before we write to a custom AD attribute, check to see if they are an exact match rather than using RegEx.

The part I am still confused about is how the formatting works.

I have had a look at to better understand how this works, but I am still confused and I cannot get your example to work in another example.

If I understand correctly in the line

'+44(0){0} {1} {2}' -f $matches[1], $matches[2], $matches[3] 

you are telling the formatting command to put into matches[1],[2] and [3] the relevant parts of the number, but I am struggling to see how. Is this because of the RegEx in $pattern?

Thanks again for all of your help!