Ruby 如何将字符串的开头和结尾与正则表达式匹配
我正在尝试匹配各种书写操作系统名称的形式。我想在开头匹配一个字符串,即第一个数字,如果最后两个字符是“\d”,也要抓住它。 例如,给定字符串“Oracle Enterprise Linux 5-X86_64 9”,我希望匹配“Oracle”、“5”和“9”。 我试过:Ruby 如何将字符串的开头和结尾与正则表达式匹配,ruby,regex,Ruby,Regex,我正在尝试匹配各种书写操作系统名称的形式。我想在开头匹配一个字符串,即第一个数字,如果最后两个字符是“\d”,也要抓住它。 例如,给定字符串“Oracle Enterprise Linux 5-X86_64 9”,我希望匹配“Oracle”、“5”和“9”。 我试过: oracle[a-z]*([0-9])(?:*)*([0-9])$但这与整个字符串匹配 oracle[a-z]*([0-9])(?:)*([0-9])$但这也匹配所有内容 oracle[a-z]*([0-9])*([0-9])$相
oracle[a-z]*([0-9])(?:*)*([0-9])$
但这与整个字符串匹配
oracle[a-z]*([0-9])(?:)*([0-9])$
但这也匹配所有内容
oracle[a-z]*([0-9])*([0-9])$
相同的结果
为什么“$”不强制它匹配我想要的字符串 这对我很有用:
irb(main):009:0> "Oracle Enterprise Linux 5-X86_64 9".match(/^(Oracle )[^\d]+(\d+).*(\d+$)/i)
=> #<MatchData "Oracle Enterprise Linux 5-X86_64 9" 1:"Oracle " 2:"5" 3:"9">
(Oracle )[^\d]+(\d+).*(\d+$)
irb(main):009:0>“Oracle Enterprise Linux 5-X86_64 9”。匹配(/^(Oracle)[^\d]+(\d+).*(\d+$)/i)
=> #
(Oracle)[^\d]+(\d+).*(\d+$)
对于
str = "Oracle Enterprise Linux 5-X86_64 9"
你说的
r = /oracle[ a-z]* ([0-9])(?:.* )*?([0-9])$/i
“匹配整个字符串”(我在末尾添加了I
)。作为
我们看到这是真的,但我们想要的是捕获组的内容
$1 #=> "5"
$2 #=> "9"
str.scan(r).first
#=> ["Oracle", "5", "9"]
如你所见,你只是忽略了在开头捕捉单词。因此,您可以这样编写正则表达式。(我做了一些小的改进。)
该方法提供了提取所需字符串的更好方法。(有关该方法如何处理捕获组,请参见文档。)
r = /
(\p{L}+) # match one or more letters in capture group 1
\D* # match zero or more characters other than digits
(\d) # match a digit in capture group 2
.+ # match one or more characters
(\d+) # match one or more digits in capture group 3
\z # match the end of the string
/x # free-spacing regex definition mode
str.match(r)
$1 #=> "Oracle"
$2 #=> "5"
$3 #=> "9"
str.scan(r).first
#=> ["Oracle", "5", "9"]