Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何将字符串的开头和结尾与正则表达式匹配_Ruby_Regex - Fatal编程技术网

Ruby 如何将字符串的开头和结尾与正则表达式匹配

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])$相

我正在尝试匹配各种书写操作系统名称的形式。我想在开头匹配一个字符串,即第一个数字,如果最后两个字符是“\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])$
相同的结果

为什么“$”不强制它匹配我想要的字符串

这对我很有用:

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"]