views:

769

answers:

1

I would like to validate a hostname using only regualr expression.

Host Names (or 'labels' in DNS jargon) were traditionally defined by RFC 952 and RFC 1123 and may be composed of the following valid characters.

List item

  • A to Z ; upper case characters
  • a to z ; lower case characters
  • 0 to 9 ; numeric characters 0 to 9
  • - ; dash

The rules say:

  • A host name (label) can start or end with a letter or a number
  • A host name (label) MUST NOT start or end with a '-' (dash)
  • A host name (label) MUST NOT consist of all numeric values
  • A host name (label) can be up to 63 characters

How would you write Regular Expression to validate hostname ?

+4  A: 
^(?![0-9]+$)(?!-)[a-zA-Z0-9-]{,63}(?<!-)$

I used the following testbed written in Python to verify that it works correctly:

tests = [
    ('01010', False),
    ('abc', True),
    ('A0c', True),
    ('A0c-', False),
    ('-A0c', False),
    ('A-0c', True),
    ('o123456701234567012345670123456701234567012345670123456701234567', False),
    ('o12345670123456701234567012345670123456701234567012345670123456', True),
    ('', True),
    ('a', True),
    ('0--0', True),
]

import re
regex = re.compile('^(?![0-9]+$)(?!-)[a-zA-Z0-9-]{,63}(?<!-)$')
for (s, expected) in tests:
    is_match = regex.match(s) is not None
    print is_match == expected
Mark Byers
Spot on Mark - just what I'm after !!
Rwahyudi
I updated it to accept the empty string too, based on your comment to the question.
Mark Byers