【问题标题】:Regular Expressions: How to Express \w Without Underscore正则表达式:如何在没有下划线的情况下表示 \w
【发布时间】:2013-02-13 16:35:54
【问题描述】:

有没有简洁的表达方式:

\w but without _

即“\w中包含的所有字符,_除外”

我问这个是因为我正在寻找最简洁的方式来表达域名验证。域名可以包含小写和大写字母、数字、句号和破折号,但不能包含下划线。 \w 包括以上所有内容,外加一个下划线。那么,有没有办法通过正则表达式从 \w 中“删除”下划线?

已编辑: 我问的是 PHP 中使用的正则表达式。

提前致谢!

【问题讨论】:

  • 取决于正则表达式的风格。您使用哪种语言?最简单的方法就是使用[A-Za-z0-9]\w 确实(通常)包含破折号或句点。
  • 根据风格 \w 可能支持 Unicode 字符。除非您完全确定 \w 代表什么,否则最好使用字符类 [] 并正常列出所有这些。

标签: php regex url


【解决方案1】:

以下字符类(在 Perl 中)

[^\W_]

\W[^\w] 相同

【讨论】:

  • 向我解释它是如何不是......并注意?: 部分只是说实际上没有捕获原子找到的组
  • @protist:原子是错误的。 \w 将匹配 _,而 | 是交替,作用类似于 OR,而不是 AND
  • 对不起,我应该在之前提到过。我正在使用 PHP。这可以在 PHP 中使用吗?
  • 我不是 PHP 专家,但有一点研究证实 PHP 确实有一个 \W,就像我的 Perl 中使用的那样。这也可能对您有用。
  • 那么,我是否理解正确,[^\W_] 与 [A-Za-z0-9.-] 相同?
【解决方案2】:

您可以使用negative lookahead(?!_)\w

不过,我认为写[a-zA-Z0-9.-] 更具可读性。

【讨论】:

  • 那应该是(?!_)\w,不是吗?
  • 环视比正常匹配慢。不过在这里可能无关紧要
  • 非常感谢,@Bergi - 我有一个问题:写 [a-zA-z0-9\.\-] 是否合适 - 转义句点和破折号 - 或者是在这种情况下,错误/不必要地逃避它们? (我是正则表达式的新手,这可能是一个愚蠢的问题......)
  • 不需要:regular-expressions.info/charclass.html。只有在字符类 (]\^-) 中具有特殊含义的字符才需要转义,而不是在明确的情况下。
  • @Dimitri:是的,这取决于\w 在您的正则表达式中意味着[a-zA-Z0-9.-_]
【解决方案3】:

为了安全起见,通常我们会使用字符类:

[a-zA-Z0-9.-]

上面的正则表达式“片段”匹配英文字母和数字,加上句点. 和破折号-。即使使用最基本的正则表达式支持,它也应该可以工作。

越短越好,但前提是您确切知道它代表什么。

我不知道您使用的是什么语言。在很多引擎中,\w 等价于[a-zA-Z0-9_](有些需要“ASCII 模式”)。但是,某些引擎支持 Unicode 正则表达式,并且可能扩展 \w 以匹配 Unicode 字符。

【讨论】:

  • 这将排除所有 unicode 字符,如“äö”等。
  • @MrD:是的,最好的方法是根本不使用正则表达式进行域验证。
【解决方案4】:

如果我的理解是正确的\w 表示[A-Za-z0-9_] 句号,则不包括破折号。

信息: http://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes

所以我猜你想要的是[a-zA-Z0-9.-]

【讨论】:

  • 当你有非英文字母时,问题就来了。
  • @ZoltánTamási 域名,非英文字母?
  • 抱歉,我错过了。但是,AFAIK 现在您可以获得带有口音的域(至少在匈牙利)。
【解决方案5】:

某些正则表达式风格具有您可能使用的否定后向语法:

\w(?<!_)

【讨论】:

  • 负前瞻比负后瞻得到更广泛的支持。
  • @JosephSilber 是的。从概念上讲,我发现“给我一个单词字符......但不是下划线”比“我想要的下一个东西不应该是一个下划线......否则,给我一个单词字符”更容易遵循,如果消极的向后看不过可用的。
【解决方案6】:

我会从 [^_] 开始,然后想想我还需要拒绝哪些字符。如果您需要过滤键盘输入,枚举所有不需要的字符非常简单。

【讨论】:

  • 这是一个非常糟糕的方法。域名有一组定义的允许字符,因此可以将其列入白名单。当您列入黑名单时,您还需要关心您需要拒绝哪些 Unicode 字符。
  • @nhahtdh,我已经考虑到域名称可以具有 unicode 字符(例如重音元音)。所以我认为要精确形成一个最终正确的白名单解决方案是相当困难的。
  • 有规范 - 这很麻烦,但已定义。人们在列入黑名单时往往会忘记/忽略某些事情。
  • 我同意,这就是为什么我提到如果案例是键盘输入,因为这可以简化事情恕我直言。
【解决方案7】:

你可以这样写:

\([^\w]|_)\u

如果您将此字符串与 preg_filter 一起使用,则 \w 中的任何字符(不包括 _ 下划线)都将被过滤。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 2021-04-30
    相关资源
    最近更新 更多