Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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,显然我还是不明白它到底是怎么工作的 这是我的问题:我试图匹配字符串中的数字,例如: 910 -6.258000 6.290 该字符串应为我提供如下数组: [910, -6.2580000, 6.290] 当绳子 blabla9999 some more text 1.1 不应该匹配 我尝试使用的正则表达式是 /([-]?\d+[.]?\d+)/ 但事实并非如此。有人能帮我吗 如果答案能澄清括号在匹配中的用法,那就太好了。括号有不同的含义 []定义了一个字符类,这意

显然我还是不明白它到底是怎么工作的

这是我的问题:我试图匹配字符串中的数字,例如:

     910     -6.258000  6.290
该字符串应为我提供如下数组:

[910, -6.2580000, 6.290]
当绳子

  blabla9999 some more text 1.1
不应该匹配

我尝试使用的正则表达式是

/([-]?\d+[.]?\d+)/
但事实并非如此。有人能帮我吗


如果答案能澄清括号在匹配中的用法,那就太好了。

括号有不同的含义

[]
定义了一个字符类,这意味着匹配了一个属于该类的字符

()
定义捕获组时,括号中此部分匹配的字符串放入变量中


您没有定义任何锚定,因此您的模式将匹配第二个字符串

blabla9999 some more text 1.1
      ^^^^  here          ^^^ and here
也许这是你想要的

^(\s*-?\d+(?:\.\d+)?\s*)+$
看到了吗

^
将模式锚定到字符串的开头,
$
锚定到字符串的结尾


它允许在数字前后使用空格
\s
和可选的分数部分
(?:\。\d+)
这种模式将至少匹配一次。

括号具有不同的含义

[]
定义了一个字符类,这意味着匹配了一个属于该类的字符

()
定义捕获组时,括号中此部分匹配的字符串放入变量中


您没有定义任何锚定,因此您的模式将匹配第二个字符串

blabla9999 some more text 1.1
      ^^^^  here          ^^^ and here
也许这是你想要的

^(\s*-?\d+(?:\.\d+)?\s*)+$
看到了吗

^
将模式锚定到字符串的开头,
$
锚定到字符串的结尾


它允许在数字前后使用空格
\s
和可选的分数部分
(?:\。\d+)
这种模式将至少匹配一次。

以下是一种有效的模式:

/^[^\d]+?\d+[^\d]+?\d+[\.]?\d+$/
请注意,[^\d]+表示至少一个非数字字符

仔细想想,这里有一个更通用的解决方案,不需要处理正则表达式:

str.gsub(/[^\d.-]+/, " ").split.collect{|d| d.to_f}
例如:

str = "blabla9999 some more text -1.1"
解析:

[9999.0, -1.1]

以下是一个有效的模式:

/^[^\d]+?\d+[^\d]+?\d+[\.]?\d+$/
请注意,[^\d]+表示至少一个非数字字符

仔细想想,这里有一个更通用的解决方案,不需要处理正则表达式:

str.gsub(/[^\d.-]+/, " ").split.collect{|d| d.to_f}
例如:

str = "blabla9999 some more text -1.1"
解析:

[9999.0, -1.1]
可能/(?\d+(.\d+)?+/

irb(main):010:0> "910     -6.258000  6.290".scan(/(\-?\d+(\.\d+)?)+/).map{|x| x[0]}
=> ["910", "-6.258000", "6.290"]
可能/(?\d+(.\d+)?+/

irb(main):010:0> "910     -6.258000  6.290".scan(/(\-?\d+(\.\d+)?)+/).map{|x| x[0]}
=> ["910", "-6.258000", "6.290"]
如果不希望整数转换为浮点数,请尝试以下操作:

str = "    910     -6.258000  6.290"
str.scan(/-?\d+\.?\d+/).map do |ns|
  ns[/\./] ? ns.to_f : ns.to_i
end
# => [910, -6.258, 6.29]
如果不希望整数转换为浮点数,请尝试以下操作:

str = "    910     -6.258000  6.290"
str.scan(/-?\d+\.?\d+/).map do |ns|
  ns[/\./] ? ns.to_f : ns.to_i
end
# => [910, -6.258, 6.29]

您是否考虑过使用空格分割?您是否考虑过使用空格分割?“您没有定义任何锚定”:您所说的锚定是什么意思?@Cedric an an anchor将模式锚定到某些点,例如字符串或单词的开头。没有它,你就允许你的模式在字母后直接匹配。“你没有定义任何锚”:你所说的锚是什么意思?@Cedric锚将模式锚定到某些点,比如字符串或单词的开头。没有它,你可以让你的模式开始匹配后,你的字母直接。