【问题标题】:Regex to match anything but an alphanumeric character or a hyphen正则表达式匹配除字母数字字符或连字符以外的任何内容
【发布时间】:2016-01-16 12:06:14
【问题描述】:

我正在尝试允许用户注册一个仅包含字母(任何语言)、数字或连字符的用户名。我正在尝试检查用户名是否违反此规则。

到目前为止,我们正在确定用户名是否仅包含字母数字字符:

REFindNoCase('^[[:alnum:]]', ARGUMENTS.Username)

这很好,因为如果我得到一个找到的结果,那么我知道它是一个无效的用户名格式,其中包含特殊字符。但我也想允许连字符通过。我怎么能用正则表达式表达(伪代码如下):

REFindNoCase('^[[:alnum:]\-]', ARGUMENTS.Username)

我只能使用与 Perl 兼容的 Regex,因为我使用的 ColdFusion 主要使用该标准。

【问题讨论】:

  • PCRE 不是 Perl。固定标签。
  • @ikegami ColdFusion 支持仅与 Perl 兼容的正则表达式
  • 那是不可能的。它可能使用与 Perl 不同的“Perl 兼容正则表达式”(PCRE)引擎。
  • @ikegami:正确。 CF 使用 Apache ORO,这是一个(非常老旧的)PCRE 实现。

标签: regex coldfusion pcre


【解决方案1】:

首先,您认为REFindNoCase('^[[:alnum:]]', ARGUMENTS.Username) 没问题是错误的。它检查第一个字符是否是字母数字。

$ for q in Abcdef Abc123 Abc-123 Abc/123 ; do
   if echo "$q" | grep -qP '^[[:alnum:]]'
   then echo "$q: match"
   else echo "$q: no match"
   fi
done
Abcdef: match
Abc123: match
Abc-123: match
Abc/123: match

grep -P 也使用 PCRE。)

要查找不是 alnum 字符的字符,您可以使用

[^[:alnum:]]

如下所示:

$ for q in Abcdef Abc123 Abc-123 Abc/123 ; do
   if echo "$q" | grep -qP '[^[:alnum:]]'
   then echo "$q: match"
   else echo "$q: no match"
   fi
done
Abcdef: no match
Abc123: no match
Abc-123: match
Abc/123: match

要查找既不是 alnum 字符也不是“-”的字符,您可以使用

[^[:alnum:]-]

如下所示:

$ for q in Abcdef Abc123 Abc-123 Abc/123 ; do
   if echo "$q" | grep -qP '[^[:alnum:]-]'
   then echo "$q: match"
   else echo "$q: no match"
   fi
done
Abcdef: no match
Abc123: no match
Abc-123: no match
Abc/123: match

顺便说一句,REFindREFindNoCase 一样好用,因为alnum 包括大写和小写字母,所以不妨使用REFind

【讨论】:

  • 感谢您的建议。经过多次反复试验,我刚刚解决了它:REFind('[^[:alnum:]-]', ARGUMENTS.Username)。我不知道它为什么起作用,但唯一的区别是否定 ^ 在第一个左方括号内
  • 这与您的要求相反。看看字符串是否包含一个既不是“alnum”也不是“-”的字符。
  • 你是什么意思?我希望它匹配不包含字母数字字符或连字符的字符串。然后又会向我表明用户名包含特殊字符,例如 <>%$£
  • 对,和你问的正好相反。
  • 我还需要包含其他连字符/破折号吗? {Pd} 的 Unicode 模式可以匹配各种破折号。你知道我可以使用什么等价物吗?
【解决方案2】:

更新:我看了这个问题RegEx: \w - "_" + "-" in UTF-8

反复试验后的最终解决方案(否定必须在左括号内):

REFind('[^[:alnum:]-]', ARGUMENTS.Username)

【讨论】:

    猜你喜欢
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    相关资源
    最近更新 更多