ruby - 如何匹配一堆数字后的非字母和非数字?

标签 ruby regex alphanumeric non-alphanumeric

我正在使用 Ruby 2.4。我想匹配一堆非字母和数字,后跟一个或多个数字,然后是任意数量的非字母和数字。然而,这个字符串

2.4.0 :001 > token = "17 Milton,GA"
 => "17 Milton,GA"
...
2.4.0 :004 > Regexp.new("\\A([[:space:]]|[^\p{L}^0-9])*\\d+[^\p{L}^0-9]*\\z").match?(token.downcase)
 => true

匹配我的正则表达式,但我不希望它匹配,因为数字后面有字母。我需要在我的正则表达式中调整什么,以便在数字之后我唯一可以匹配的是非字母和非数字?

最佳答案

正则表达式有几个问题。

1) 当您在 Regexp.new 构造函数中使用双引号字符串文字时,要声明文字反斜杠,您需要将其加倍 (\p => \\p)

2) [^\p{L}^0-9] 对于除字母和数字之外的任何字符都是错误的构造,因为第二个 ^ 被处理作为文字 ^ 符号。您至少需要删除第二个 ^ 。您还可以使用 [^[:alnum:]] 来匹配任何非字母数字符号。

3) 上面的模式也匹配空格,因此您不需要将它与 [[:space]] 交替使用。 ([[:space:]]|[^\p{L}^0-9])* -> [^\p{L}0-9]*.

因此,您可以使用固定的 Regexp.new("\\A[^\\p{L}0-9]*\\d+[^\\p{L}0-9]*\\z") 正则表达式,或者使用

/\A[^[:alnum:]]*\d+[^[:alnum:]]*\z/.match?(token.downcase)

参见 Rubular demo您的示例字符串与正则表达式不匹配的地方。

详细信息:

  • \A - 字符串的开始
  • [^[:alnum:]]* - 0+ 个非字母数字字符
  • \d+ - 1+ 位
  • [^[:alnum:]]* - 0+ 个非字母数字字符
  • \z - 字符串结尾。

关于ruby - 如何匹配一堆数字后的非字母和非数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44090008/

相关文章:

ruby-on-rails - 在 rails 中测试 - 表单中的第一个参数不能包含 nil 或为空

ruby - 使用 RVM 使用 sinatra 应用程序加载 Active Record gem 时出错

Ruby 在 Windows 任务调度程序中的行为不同

python - 如何将正则表达式匹配的一部分作为python中的变量?

python - 如何正确使用Python的正则表达式库的for循环?

r - 在 R 中处理日期正则表达式捕获组输出

ruby-on-rails - 运行 db :seed 时数组的未定义方法 'transactions'

javascript - 返回字母数字 - 组合函数片段的问题

javascript - 使用所有特殊字符验证字母数字值

bash,删除文件名中包含字母的文件