1

这个字符集

[^\/:] // all characters except / or :

每个 jslint bc 都很弱我应该指定可以使用的字符而不是这个SO Post不能使用的字符。

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

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

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

我不关心我的域检查器的完整性(它只是一个原型)......我关心的是如何以不同的方式编写 reg-exes。

4

4 回答 4

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-]*
于 2012-08-23T22:31:18.613 回答
1

这是您可以拥有的字符的正则表达式:

mycharactersarecool[^shouldnothavethesechars](oneoftwooptions|anotheroption)

这就是你在说的吗?

于 2012-08-23T22:27:43.223 回答
1

这对谷歌来说是一个很好的问题,你知道......但只是为了弄湿你的嘴:Matthew O'Riordan 编写了这样的正则表达式,数学与协议或不协议相关。

这是他的博客文章的链接

但为了将来参考,让我在这里也提供帖子中的正则表达式:

/((([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_.]

这应该匹配 // 之后和第一个 / 之前的所有内容。但是,当您的 URL 不以斜杠结尾时会发生什么?在这种情况下你会怎么做?

上正则表达式(简化)只匹配一个字符,就像您的否定字符集一样。因此,这只是替换了您正在使用的完整 reg ex 中的否定集。

于 2012-08-23T22:24:45.220 回答
1

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

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

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

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

但是,如果您有一组特定的无效字符,则[^]语法是执行此操作的适当方法。

于 2012-08-23T22:25:08.177 回答