// The regular expressions that power the parsing engine
parse: [
// Match: [@value='test'], [@foo]
// The regular expressions that power the parsing engine
parse: [
// Match: [@value='test'], [@foo]
// Match: [div], [div p]
/^(\[)\s*(.*?(\[.*?\])?[^[]*?)\s*\]/,
// Match: :contains('foo')
// Match: [div], [div p]
/^(\[)\s*(.*?(\[.*?\])?[^[]*?)\s*\]/,
// Match: :contains('foo')
- // Match: :even, :last-chlid
- /^([:.#]*)([a-z0-9_*-]*)/i
+ // Match: :even, :last-chlid, #id, .class
+ /^([:.#]*)([\w\u0128-\uFFFF*-]+)/i
// Continue while a selector expression exists, and while
// we're no longer looping upon ourselves
// Continue while a selector expression exists, and while
// we're no longer looping upon ourselves
} else {
// Otherwise, do a traditional filter check for
// ID, class, and element selectors
} else {
// Otherwise, do a traditional filter check for
// ID, class, and element selectors
// Do a quick check for the existence of the actual ID attribute
// to avoid selecting by the name attribute in IE
if ( jQuery.browser.msie && oid && oid.id != m[2] )
// Do a quick check for the existence of the actual ID attribute
// to avoid selecting by the name attribute in IE
if ( jQuery.browser.msie && oid && oid.id != m[2] )
// And combine the results
done = jQuery.merge( done, ret );
// And combine the results
done = jQuery.merge( done, ret );
// :not() is a special case that can be optimized by
// keeping it out of the expression list
if ( m[1] == ":" && m[2] == "not" )
// :not() is a special case that can be optimized by
// keeping it out of the expression list
if ( m[1] == ":" && m[2] == "not" )