Regexp: (\.//)?(((child::)?((\i\c*:)?(\i\c*|\*)))|\.)(/(((child::)?((\i\c*:)?(\i\c*|\*)))|\.))*(\|(\.//)?(((child::)?((\i\c*:)?(\i\c*|\*)))|\.)(/(((child::)?((\i\c*:)?(\i\c*|\*)))|\.))*)* a: Ok a12/b312/b312/b312/b312/b312/b312/b312/b312/b312/b312/b312/b3: Ok *: Ok a|b: Ok .//a:b: Ok a/b/c: Ok a/*/b: Ok a:*/b:*/c:*: Ok child::a/child::b:*: Ok child::a/child::b:*|a/*/b|.//a:b: Ok 1: Fail 1ab: Fail a:1: Ok @a: Fail ancestor::a: Ok Regexp: (\.//)?(((child::)?(([\i-[:]][\c-[:]]*:)?([\i-[:]][\c-[:]]*|\*)))|\.)(/(((child::)?(([\i-[:]][\c-[:]]*:)?([\i-[:]][\c-[:]]*|\*)))|\.))*(\|(\.//)?(((child::)?(([\i-[:]][\c-[:]]*:)?([\i-[:]][\c-[:]]*|\*)))|\.)(/(((child::)?(([\i-[:]][\c-[:]]*:)?([\i-[:]][\c-[:]]*|\*)))|\.))*)* a: Ok a12/b312/b312/b312/b312/b312/b312/b312/b312/b312/b312/b312/b3: Ok *: Ok a|b: Ok .//a:b: Ok a/b/c: Ok a/*/b: Ok a:*/b:*/c:*: Ok child::a/child::b:*: Ok child::a/child::b:*|a/*/b|.//a:b: Ok 1: Fail 1ab: Fail a:1: Fail @a: Fail ancestor::a: Fail