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,假设我有以下测试字符串: I want to match: 123 456 我想使用正则表达式来捕获123和456 我正在尝试这个: I want to match:(?:\n\s\s(\d*))* 但它只捕获最后一组。有什么想法吗 I want to match:\K|\G(?!^)(?:\n\s\s(\d+)) 您可以使用\G,因为正则表达式引擎只记住最后一个组。请参阅演示 您可以使用\G,因为正则表达式引擎只记住最后一个组。请参阅演示 您可以像这样捕获示例字符串:\n*\s

假设我有以下测试字符串:

I want to match:
  123
  456
我想使用正则表达式来捕获
123
456

我正在尝试这个:

I want to match:(?:\n\s\s(\d*))*
但它只捕获最后一组。有什么想法吗

I want to match:\K|\G(?!^)(?:\n\s\s(\d+))
您可以使用
\G
,因为正则表达式引擎只记住最后一个组。请参阅演示

您可以使用
\G
,因为正则表达式引擎只记住最后一个组。请参阅演示


您可以像这样捕获示例字符串:
\n*\s*(\d+)
您可以像这样捕获示例字符串:
\n*\s*(\d+)
您可以使用
字符串扫描

s = <<-STR
  123
  456
STR

s.scan /\d+/    #=> ["123", "456"]
s.scan /(\d+)/  #=> [["123"], ["456"]]
s=[[“123”],[“456”]]
您可以使用
String#scan

s = <<-STR
  123
  456
STR

s.scan /\d+/    #=> ["123", "456"]
s.scan /(\d+)/  #=> [["123"], ["456"]]
s=[[“123”],[“456”]]

一旦你匹配了字符串中的部分
我想匹配:
,你的下一个匹配点就会在那之后的某个地方。这意味着,给定测试字符串的格式,您只能与该正则表达式匹配一次。

一旦您匹配了字符串中我想要匹配的部分:
,您的下一个匹配点将位于该部分之后的某个位置。这意味着,给定测试字符串的格式,您只能与该正则表达式匹配一次。

不幸的是,您无法获得捕获组的所有捕获值。 一个好的解释是,它说:

给定组的返回值是最后捕获的值
由于带有量词的捕获组保留其编号,因此在检查该组时,引擎将返回什么值?所有引擎返回捕获的最后一个值。例如,如果将字符串A_B_C_D_与([A-Z])+匹配,则在检查匹配时,组1将为D。除.NET引擎外,所有中间值都将丢失。本质上,组1在每次模式匹配时都会被覆盖

因此,如果您知道要捕获的行最多为2行,那么您可以尝试以下方法:

I want to match:(?:\n\s\s(\d*))?(?:\n\s\s(\d*))?

i、 e.手动为每行重复捕获组。

不幸的是,您无法获得捕获组的所有捕获值。 一个好的解释是,它说:

给定组的返回值是最后捕获的值
由于带有量词的捕获组保留其编号,因此在检查该组时,引擎将返回什么值?所有引擎返回捕获的最后一个值。例如,如果将字符串A_B_C_D_与([A-Z])+匹配,则在检查匹配时,组1将为D。除.NET引擎外,所有中间值都将丢失。本质上,组1在每次模式匹配时都会被覆盖

因此,如果您知道要捕获的行最多为2行,那么您可以尝试以下方法:

I want to match:(?:\n\s\s(\d*))?(?:\n\s\s(\d*))?
i、 e.为每一行手动重复捕获组