From W3C Wiki

A Universal Resource Identifier, in this WIKI, is defined to be an ASCII string used to identify things on the Semantic Web.

Hey, that's a little contentious. I wrote pages elsewhere in this Wiki that defer to RFC2396 (rightly or wrongly) when talking about URIs. There are lots of ASCII strings (eg. N3) documents which aren't URIs, but which are used to identify things on the Semantic Web. --DanBri

Some strings contain a hash mark. Such as string is known as a HashURI.

RFC 2396 gives the syntactic constraints on a URI string. Within that RFC, the term "URI" is used locally to refer to URIs which are not HashURI s.

The IRI specification gives a way of mapping subset of the set of Unicode strings onto the set of URIs, and also a mapping back. These functions are not inverse of each other as they are not 1:1.

Protocols are defined for operating on URIs, and are defined depending on the UriScheme. Other URI schemes are meant only as identifiers (UriSchemes/tag, UriSchemes/urn), not locators.

@prefix : <http://esw.w3.org/topic/>.

:URI  s:subClassOf :ASCIIString;
      s:label      :"URI".

:IRI  s:subClassOf :String;
      s:label      :"IRI".

:equivalentIRI a owl:FunctionalProperty;
    s:label "equivalent IRI";
    s:domain :URI;
    s:range :IRI.

:equivalentURI a owl:FunctionalProperty;
    s:label "equivalent URI";
    s:domain :IRI;
    s:range :URI;
    s:comment """
    Note this is NOT the inverse of equivalent IRI.""".

:identifies a rdf:Property;
    s:label "identifies";
    s:domain :URI.

log:uri a rdf:Property;
    s:label "uri";
    s:range :URI;
    owl:inverse :identifies.

:Scheme s:subClassOf :ASCIIString;
    s:label "URI scheme".

:scheme a rdf:Property;
    s:label "scheme";
    s:domain URI;  s:range :Scheme.

{ ?u a :URI. ( ?u "([a-z0-9-\.]*):.*" ) string:scrape ?s} => { ?u :scheme ?s}. 

:UWI s:subClassOf :URI;
    s:label "Universal Web identifier".

{ ?u a :URI. ( ?u string:match "[^#]*"} => { ?u a :UWI }.

:uwi a rdf:Property;             # log:racine
    s:label "UWI part";
    s:domain URI;  s:range :UWI.

{ ?u a :URI. ( ?u "(.*)#.*" ) string:scrape ?w} => { ?u :racine ?w }. 

:localTerm a rdf:Property;
    s:label "local term";
    s:domain uri;  s:range string:String.

{ ?u a :URI. ( ?u ".*#(.*)" ) string:scrape ?t} => { ?u :localTerm ?t }.