Ruby正则表达式匹配

时间:2015-05-20 12:21:49

标签: ruby regex

为什么这个正则表达式

(?<!\S)[^\s]*[aeiou][^\s]*(?<=\d)(?!\S)

匹配test123但不匹配123test

我想匹配一个必须有元音和数字的单词。由于我是新手,我完全不了解所有方法。也许这会引起问题。

3 个答案:

答案 0 :(得分:5)

  

我想匹配一个必须有元音和数字的单词

(?<!\S)\S*(?:[aeiou]\S*\d|\d\S*[aeiou])\S*(?!\S)

这部分在你的正则表达式中,

(?<=\d)(?!\S)

将查找要出现的数字,该数字不得跟随非空格字符。在这个test123中,因为最后出现的3满足这个条件,其中3后面没有非空格字符。因此,您的正则表达式匹配test123并且无法匹配123test,因为此输入中存在的所有数字后跟非空格字符。而且你的正则表达式声称在数字之前必须存在一个元音。这也是一个原因。

答案 1 :(得分:1)

(?<!\S)[^\s]*[aeiou][^\s]*(?<=\d)(?!\S)

                          ^^^^^^^ 

由于lookbehind使得正则表达式引擎在integer

中没有出现的最后一次匹配后查找123test

根据您的需求,您只需使用

即可
\b(?=[a-zA-Z0-9]*[0-9])(?=[a-zA-Z0-9]*[aeiou])[a-zA-Z0-9]+\b

参见演示。

https://www.regex101.com/r/fJ6cR4/27

答案 2 :(得分:0)

执行此操作的替代方法:

def vowel_and_num?(str)
 !(str.scan(/[aeiou]/).empty? || str.scan(/[0-9]/).empty?)
end

vowel_and_num?("test123")
# => true

vowel_and_num?("123test")
# => true

vowel_and_num?("test")
# => false

vowel_and_num?("123")
# => false