【问题标题】:How to improve a regex expression in order to match "special" letters?如何改进正则表达式以匹配“特殊”字母?
【发布时间】:2011-08-11 17:25:45
【问题描述】:

我正在使用 Ruby on Rails 3.0.9 并且我正在使用以下正则表达式来验证包含字母、空格和数字的字符串(如果我是对的,它应该匹配那些提到的字符):

/^[\w\s-]*$/u

我还想改进该正则表达式以匹配可以包含“特殊”字符\字母的字符串,例如'"%&*、@ 987654327@、!?()[]如何更改上述正则表达式以匹配它们?


更新

我忘记了在上面的表达式中,我还想匹配\验证 重音 字母,例如 àèéìò 和 @ 987654339@.

【问题讨论】:

  • 也许制作排除某些字符集的正则表达式会更好?
  • 语言注释:“文字”不是“字母”(甚至“字符”)的花哨词。它表示一个常量,其值直接在源代码中给出。在许多语言中,'&' 是字符文字,但 & 本身只是一个字符。
  • @Henning Makholm 非常感谢您的提示。

标签: ruby-on-rails ruby regex ruby-on-rails-3


【解决方案1】:

只需将额外的字符添加到您的字符类中,同时转义任何在正则表达式字符类中具有特殊含义的字符(在您的情况下只是 []):

/^[\w\s'"%&*@!?()\[\]-]*$/u

还要确保将 - 放在字符类的末尾或对其进行转义 (\-),这样正则表达式解析器就不会认为它表示范围。

如果您还想输入 Unicode “单词”字符,请将 \w 替换为 \p{Word}

/^[\p{Word}\s'"%&*@!?()\[\]-]*$/

当然,假设您使用的是 1.9。如果您不使用 1.9,那么您应该升级以获得更好的 Unicode 支持。

Oniguruma(Ruby 的 1.9 正则表达式引擎)的 \p{} 语法用于命名属性,听起来您正在寻找“单词”属性,因此 \p{Word} 是您对 \w 的替代品。你可能想用\p{Space}替换\s

/^[\p{Word}\p{Space}'"%&*@!?()\[\]-]*$/

有关 Oniguruma 语法的更多详细信息,请参见此处:

http://www.geocities.jp/kosako3/oniguruma/doc/RE.txt

【讨论】:

  • 使用你的第二个正则表达式/^[\p{Word}\s'"-_%&*@!?()\[\]-]*$/(注意:我刚刚添加了-_)来验证像abcd ç #这样的表达式(在这种情况下验证应该失败,因为在字符串中有@987654339 @ 和 # 字母)我收到以下错误:Encoding::CompatibilityError (incompatible encoding regexp match (ASCII-8BIT regexp with UTF-8 string))。我正在使用 Ruby 1.9.2。
  • @Backo: (1) "-_ 可能不是你想要的,这是从"_ 的范围。 (2) 你的脚本中有# coding: utf-8 表示它是UTF-8 编码的吗? irb 对我来说很好用。
  • (1) 所以,我想我应该使用/^[\p{Word}\p{Space}\-_'"%&*@!?()\[\]-]*$/(注意使用\-,正如你在回答中所说的那样——如果我理解的话)。 (2) 如何检查我的脚本中是否有# coding: utf-8 表明它是UTF-8 编码的??
  • @Backo:我想你想要/^[\p{Word}\p{Space}'"%&*@!?()\[\]_-]*$/u,不需要提到- 两次,u 修饰符应该处理编码问题(但我不知道如何重现你的例外,所以我猜)。
【解决方案2】:

您可以转义特殊字符。此正则表达式:\[\] 将匹配字符串 "[]"

看看这个有用的网站:http://www.rubular.com/

您可以构建您的正则表达式并针对字符串进行测试。

编辑只需开始将这些转义的特殊字符附加到您的正则表达式中,如下所示:/^[\'\"\[\]\w\s-]*$/u 我已经附加了它,以便它现在也可以查找单个配额的任何出现 (' )、双引号 (") 和方括号 ([])。如果需要,请继续添加。

【讨论】:

  • 我应该如何“编码”我想要匹配的内容?也就是说,新的正则表达式应该怎么看?
猜你喜欢
  • 2012-12-06
  • 2022-08-17
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
相关资源
最近更新 更多