【问题标题】:Why does my regexp not tell me if a string contains no numbers?为什么我的正则表达式不告诉我字符串是否不包含数字?
【发布时间】:2017-01-14 01:20:04
【问题描述】:

我使用的是 Ruby 2.4。如何检查字符串是否不包含任何数字?我正在尝试这个

2.4.0 :002 > line = "abcdef"
 => "abcdef"

2.4.0 :007 > line =~ /^^[0-9]+$/
 => nil 

我认为“^”是“非”字符,但我不确定它是如何工作的,因为我知道它也是短语的起始字符。无论如何,感谢您的帮助,-

【问题讨论】:

    标签: ruby regex string numbers


    【解决方案1】:

    ^ 在方括号列表的开头否定一组字符:

    [^abc]  # not a, b, or c
    

    所以你只需要把它移到括号内:

    line =~ /^[^0-9]+$/
    

    请注意,您可能需要\A\z 而不是^$,因为它们匹配整个字符串的开头和结尾而不是行,并且\D[^0-9] 的缩写.

    line =~ /\A\D+\z/
    

    您也可以对数字进行否定检查。

    line !~ /\d/
    

    【讨论】:

    • 很好,但是 imo 提到否定前瞻会削弱您的答案。我不明白为什么在否定测试中需要锚点或 + 并考虑使用 \d
    • @CarySwoveland:好点;我试着扩大一点。锚是因为/^\d+$/ 不会匹配2blah,所以它的否定应该。
    • 使用\A 而不是^ 也是一个好习惯,因为它锚定到字符串的开头,而不是行的开头。区别可能非常非常重要:"foo\n123".match(/^\d+$/) 确实匹配,即使您认为它不匹配。
    • 现在才看到。如果有一个内置所有最佳实践的推荐示例,那就太好了。
    • @CarySwoveland:哎呀,我太着迷于查看/^^[0-9]+$/,以至于我没有阅读问题。对不起。
    【解决方案2】:

    你可以像这样使用match?

    'abcdef'.match?(/\d/)
     #=> false 
    

    【讨论】:

    • 嗯。起初我认为尾随的? 是一个错字,但它看起来像是 2.4.0 的新内容。非常好。
    • @Glyoko 他们补充说,对于那些你不关心比赛细节的情况,只是发生了这种情况。在这种情况下应该会快很多。
    • 阅读 Ryan 的回答后,我意识到我实际上并没有回答所提出的问题。尽管如此,这种闪亮的新方法在这里仍然很重要,所以我会留下答案。
    • + 这里不需要,是吗?
    猜你喜欢
    • 2011-07-22
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多