Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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,我想这将是一个愚蠢的错误,但对我来说,下面返回一个只包含“M”的数组。见此: /(.)+?/.match("Many many characters!").captures => ["M"] 为什么它不返回每个字符的数组?我肯定错过了一些显而易见的东西,因为我看不出这有什么不对 编辑:刚刚意识到,我不需要+?但是没有它它还是不行 编辑:抱歉!我将澄清:我的目标是允许用户输入正则表达式、样式和输入文本文件,只要有匹配项,文本将被html元素包围,并应用样式,我不仅仅是将字符串拆分为字符,我

我想这将是一个愚蠢的错误,但对我来说,下面返回一个只包含“M”的数组。见此:

/(.)+?/.match("Many many characters!").captures
=> ["M"]
为什么它不返回每个字符的数组?我肯定错过了一些显而易见的东西,因为我看不出这有什么不对

编辑:刚刚意识到,我不需要+?但是没有它它还是不行

编辑:抱歉!我将澄清:我的目标是允许用户输入正则表达式、样式和输入文本文件,只要有匹配项,文本将被html元素包围,并应用样式,我不仅仅是将字符串拆分为字符,我只使用给定的正则表达式,因为它是最简单的,尽管这对我来说很愚蠢。如何从scan()获取捕获组,还是不可能?我看到$1包含“!”(最后一场比赛?)而不是任何其他的

编辑:天哪,今天真的不是我的日子。正如injekt告诉我的,捕获的数据存储在不同的数组中。如何从原始字符串获取这些捕获的偏移量?我希望能够得到a的偏移量,然后用另一个字符串将其环绕。或者这就是gsub的目的?(我想那只是取代了比赛,而不是一个俘虏小组)

希望最终编辑:好,让我再次开始:p

所以,我有一个字符串。用户将使用配置文件输入正则表达式,然后输入与每个捕获组关联的样式。我需要能够扫描整个字符串,并获得开始和结束或偏移量和每组比赛的大小

因此,如果用户配置了
([\w-\.]+)@((?:[\w]+\.)+)([a-zA-Z]{2,4})
(电子邮件地址),那么我应该能够获得:

[ ["elliotpotts", 0,  11],
  ["sample.",     12, 7],
  ["com",         19, 3] ]
从字符串: "elliotpotts@sample.com"


如果这还不清楚的话,我只是有点不对劲:p。非常感谢各位,谢谢你们这么耐心

它只返回一个字符,因为这是您要求它匹配的所有字符。您可能想改用
扫描

str = "Many many characters!"
matches = str.scan(/(.)/)

因为您的捕获只匹配一个字符<代码>(.+)
(.+)
不同

如果要递归地匹配每个字符,请使用
String#scan
String#split
,如果不关心捕获组

使用扫描:

"Many many characters!".scan(/./)
#=> ["M", "a", "n", "y", " ", "m", "a", "n", "y", " ", "c", "h", "a", "r", "a", "c", "t", "e", "r", "s", "!"]
请注意,其他答案使用的是
(.)
,如果您关心捕获组,这很好,但如果您不关心捕获组,则这有点毫无意义,否则它将返回自己单独数组中的每个字符,如下所示:

[["M"], ["a"], ["n"], ["y"], [" "], ["m"], ["a"], ["n"], ["y"], [" "], ["c"], ["h"], ["a"], ["r"], ["a"], ["c"], ["t"], ["e"], ["r"], ["s"], ["!"]]
否则,只需使用
split
“许多字符!”。split(“”)

编辑回复您的编辑:

reg = /([\w-\.]+)@((?:[\w]+\.)+)([a-zA-Z]{2,4})/
str = "elliotpotts@sample.com"
str.scan(reg).flatten.map { |capture| [capture, str.index(capture), capture.size] }
#=> [["elliotpotts", 0, 11], ["sample.", 12, 7], ["com", 19, 3]]`
哦,你不需要扫描,你不是真正的扫描,所以你不需要遍历,至少不需要使用你提供的示例:

str.match(reg).captures.map { |capture| [capture, str.index(capture), capture.size] }

也将起作用

是的,遗漏了一些重要内容;-)

(…)
只引入一个捕获组:组匹配的次数无关紧要,因为索引只由正则表达式本身而不是输入决定

关键是一个“全局正则表达式”,它将按顺序多次应用正则表达式。在Ruby中,这是通过将
Regex#match
转换为
String#scan
(许多其他语言都有一个“/g”正则表达式修饰符):


快乐编码

以下代码来自并根据我的喜好进行了修改

[].tap {|results|
    "abab".scan(/a/) {|capture|
        results.push(([capture, Regexp::last_match.offset(0)]).flatten)
    }
}

=> [["a", 0], ["a", 2]]

我刚刚看到了你的编辑,来自扫描的捕获组存储在单独的数组中,只需尝试你的regexp和你将看到的irb中的测试字符串。答案仍然与你包含的编辑保持一致。刚刚看到你的下一次编辑,你将不得不更新更多信息。我现在有点困惑:P请随意抛出一个更完整的示例,无论如何我们精心设计了它,这样我们就能准确地知道你需要什么。好吧,用你最新的编辑更新了我的答案。我现在时间有点紧,所以它只是一个完整的解决方案,没有任何解释,如果没有意义,请告诉我,我会更新它谢谢!我也找到了一个替代答案,现在就发布。谢谢!两位在一般情况下,给定的代码段对于偏移量不能正常工作,它们仅在匹配的子字符串都不同的情况下工作。例如,如果“h”有3个匹配项,则相同的索引(“h”的第一个实例)将全部3次返回。str.index(capture)返回捕获的子字符串的第一个实例的索引。
"Many many chara­cters!".sc­an(/(.)+?/­)
# but more simply (or see answers using String#split)
"Many many chara­cters!".sc­an(/(.)/­)
[].tap {|results|
    "abab".scan(/a/) {|capture|
        results.push(([capture, Regexp::last_match.offset(0)]).flatten)
    }
}

=> [["a", 0], ["a", 2]]