2015-05-20 2 views
1

почему это регулярное выражениеРубин Регулярное выражение матч

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

матч test123 но не 123test

я хочу, чтобы соответствовать слово, которое должно иметь гласные и цифры .Как я новичок в этом я не понимаю все методы полностью. возможно, это вызывает проблемы.

ответ

5

я хочу, чтобы соответствовать слово, которое должно иметь гласные и цифры

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

Эта часть в своем регулярном выражении,

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

будет искать чтобы присутствовать, который не должен сопровождаться символом без пробела. В этом test123, поскольку 3, присутствующий в последнем, удовлетворяет этому условию, где 3 не сопровождается непространственным символом. Поэтому ваше регулярное выражение соответствует test123 и не соответствует 123test, потому что все цифры, присутствующие на этом входе, сопровождаются символом без пробела. А также ваше регулярное выражение утверждает, что перед цифрой должна существовать гласная. Это также является причиной.

+1

done ........... –

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

+0

Это не соответствующее объяснение. '(? <= \ d)' не проверяет цифру в конце, так как это * look-behind *. –

+0

@stribizhev, когда regex engine соответствует последнему символу, он проверяет, является ли это цифрой или нет. – vks

+0

@stribizhev the lookbehind помещается после употребления последнего символа. Так как совпадение завершено, regex enigne пытается искать целое число. Вкратце последнее совпадение должно быть цифрой – vks

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 
Смежные вопросы