[^ \ /:] |的反函数正则表达式改进

时间:2012-08-23 22:13:55

标签: javascript regex

此字符集

[^\/:] // all characters except / or :
每个jslint b.c.

弱。我应该指定可以使用的字符,而不是根据SO Post不能使用的字符。

这是一个简单的非生产级别域测试器,如下所示:

domain:         /:\/\/(www\.)?([^\/:]+)/,

我只是在寻找如何思考这个问题的方向。帖子提到允许无数的Unicode字符并不是一件好事...我如何制定一个更好的写一点的计划?

我并不关心我的域名检查程序的完整性(它只是一个原型)......我担心如何以不同的方式编写注册表。

4 个答案:

答案 0 :(得分:2)

根据http://en.wikipedia.org/wiki/Domain_name#Internationalized_domain_names

  

域名系统中允许的字符集基于ASCII

并按照http://www.netregister.biz/faqit.htm#1

  

为您的域名命名,您可以使用任何字母,0到9之间的数字,以及符号“ - ”[只要第一个字符不是“ - ”]

并且考虑到您的域名必须以 .something 结尾,您正在寻找

([a-zA-Z0-9][a-zA-Z0-9-]*\.)+[a-zA-Z0-9][a-zA-Z0-9-]*

答案 1 :(得分:1)

对于谷歌来说,这是一个很好的问题,你知道......但是只是为了弄湿你的喙:马修奥里奥丹已经写了这样的正则表达式,无论是否有协议都可以连接。

这是his blog post

的链接

但是为了将来的参考,我也可以在这里提供正则表达式:

/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[.\!\/\\w]*))?)/

正如博客作家马修本人所做的那样:

(
 ( # brackets covering match for protocol (optional) and domain
  ([A-Za-z]{3,9}:(?:\/\/)?)   # match protocol, allow in format http:// or mailto:
  (?:[\-;:&=\+\$,\w]+@)?   # allow something@ for email addresses
  [A-Za-z0-9\.\-]+   # anything looking at all like a domain, non-unicode domains
  | # or instead of above
  (?:www\.|[\-;:&=\+\$,\w]+@) # starting with something@ or www.
  [A-Za-z0-9\.\-]+   # anything looking at all like a domain
 )
 ( # brackets covering match for path, query string and anchor
  (?:\/[\+~%\/\.\w\-]*)  # allow optional /path
  ?\??(?:[\-\+=&;%@\.\w]*)  # allow optional query string starting with ? 
  #?(?:[\.\!\/\\\w]*) # allow optional anchor #anchor 
 )? # make URL suffix optional
)

你的具体例子

但是在你的URL域名的情况下,[^\/:]的否定可能只是:

[-0-9a-zA-Z_.]

这应该匹配//之后和之前的所有内容。但是当您的网址没有以斜线结尾时会发生什么?在那种情况下你会做什么?

高级正则表达式(简化)仅匹配一个字符,就像您的负字符集一样。所以这只是替换你正在使用的完整注册表中的负面集。

答案 2 :(得分:1)

  

“我应该指定可以使用的字符而不是不能使用的字符”

不,这是胡说八道,只是JSLint是JSLint。

当您在正则表达式中看到[^\/:]时,它立即显而易见。如果您尝试列出所有可能的允许的字符,那么生成的正则表达式将非常难以阅读,并且很容易意外忘记包含一些字符。

如果您有一组特定的允许字符,那么请列出它们。这比尝试列出所有可能的无效字符更容易,更可靠。

但是如果你有一组特定的无效字符,则[^]语法是适当的方法。

答案 3 :(得分:1)

这是你可以拥有的角色的正则表达式:

mycharactersarecool[^shouldnothavethesechars](oneoftwooptions|anotheroption)

这就是你在谈论的吗?