【问题标题】:Ruby =~to check if string matches patternRuby =~检查字符串是否匹配模式
【发布时间】:2014-03-13 10:49:14
【问题描述】:

我想检查一个字符串是否只有数字和字母。

  def valid?
    "abc#d" =~ /\p{Alnum}/
  end

但这返回 0。我希望它返回 nil,因为它包含#,它既不是字母也不是数字。

我做错了什么?

【问题讨论】:

  • def valid?(string) string =~ /\p{Alnum}/ end 会更有意义,考虑到 valid? 将始终返回 0 (true)`(当然,您仍然必须更正逻辑)。

标签: ruby regex


【解决方案1】:

问题在于你实际上是在检查:

  • 字符串是否包含任何数字或字母,

但你想检查一下:

  • 字符串是否不包含除数字或字母以外的任何内容。

你可以这样检查:

def valid?
  "abc#d" !~ /\P{Alnum}/
end

【讨论】:

  • 这会为空字符串返回true
  • @ExplosionPills 没错。那又怎样?
  • 取决于要求。问题说“字符串仅由数字和字母组成。”空字符串不仅仅由数字和字母组成。
  • @ExplosionPills 您无法判断“空字符串是否仅由数字和字母组成”。表达式“字符串仅由数字和字母组成”的前提是该字符串不为空。当一个表达式的前提不满足时,这个表达式既不真也不假,就不能被解释。换句话说,如果“字符串仅由数字和字母组成”的表达式为真,那么只有当它的前提得到满足时。
  • 我认为它根本没有预设。我认为即使您认为这种情况是正确的,许多其他人也不会预先假设。
【解决方案2】:

听起来您想检查以确保字符串包含数字和字母:

"abc#d" =~ /\A\p{Alnum}+\z/

【讨论】:

  • 谢谢。您的正则表达式是否等同于 /[^\p{Alnum}]/ +\z 在做什么?
  • @JumbalayaWanton \A 类似于^,但^ 可以在换行符之后匹配,\A 始终位于字符串的开头。同样,\z 始终位于字符串的 end 处。 + 表示一个或多个。从sawa 的回答来看,!~ 只是表示“不匹配”,但它返回一个布尔值。
  • @JumbalayaWanton Explosion Pills 的正则表达式是/[^\p{Alnum}]/ 的否定。只要/[^\p{Alnum}]/ 不匹配,它就会匹配。
  • 谢谢。您的回答解决了我的问题,但 Sawa 比我自己更了解我的追求。
  • Jumbla,当您知道兔子是粉红色或白色的,并且您想知道特定群体中的所有兔子(是的,就是所谓的)是否都是白色时,尝试发现兔子通常更容易粉红色的,而不是检查它们是否都是白色的。我认为这适用于这里。
【解决方案3】:

试试这个:

"abc#d" =~ /^[A-Za-z0-9]+$/

【讨论】:

  • 谢谢。 +$ 的地址是什么?
  • 我认为这不能回答问题。
【解决方案4】:

string !~ /[_\W]/ 也可以。

"abc#d" !~ /[_\W]/ #=> false 
"abc_d" !~ /[_\W]/ #=> false
"abc5d" !~ /[_\W]/ #=> true 

【讨论】:

    猜你喜欢
    • 2012-09-17
    • 2010-12-19
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多