为什么这个正则表达式
(?<!\S)[^\s]*[aeiou][^\s]*(?<=\d)(?!\S)
匹配test123但不匹配123test
我想匹配一个必须有元音和数字的单词。由于我是新手,我完全不了解所有方法。也许这会引起问题。
答案 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
参见演示。
答案 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