我正在使用Ruby 2.4。假设我有一个包含多个空格的字符串
str = "abc def 123ffg"
如何捕获以字母开头的字符串开头的所有连续单词?例如,在上面,我想要捕获
"abc def"
如果我有一个像
这样的字符串"aa22 b cc 33d ff"
我想抓拍
"aa22 b cc"
但如果我的字符串是
"66dd eee ff"
我想要什么都不返回,因为该字符串的第一个单词不以字母开头。
答案 0 :(得分:1)
如果你可以节省单词之间的额外空格,那么你可以split
字符串并用take_while
迭代生成的数组,使用正则表达式获得所需的输出;像这样的东西:
str = "abc def 123ffg"
str.split.take_while { |word| word[0] =~ /[[:alpha:]]/ }
#=> ["abc", "def"]
输出是一个数组,但如果需要一个字符串,最后可以使用join
:
str.split.take_while { |word| word[0] =~ /[[:alpha:]]/ }.join(" ")
#=> "abc def"
更多例子:
"aa22 b cc 33d ff".split.take_while { |word| word[0] =~ /[[:alpha:]]/ }
#=> ["aa22", "b", "cc"]
"66dd eee ff".split.take_while { |word| word[0] =~ /[[:alpha:]]/ }
#=> []
答案 1 :(得分:0)
sub
方法可用于将空字符串''
替换为需要从表达式中删除的所有内容。
在这种情况下,如果以数字开头,则需要第一个sub
方法来删除整个文本。然后另一个sub
将从任何以数字开头的单词开始删除所有内容。
<强>答案:强>
str.sub(/^\d+.*/, '').sub(/\s+\d+.*/, '')
<强>输出:强>
str = "abc def 123ffg"
# => "abc def"
str = "aa22 b cc 33d ff"
# => "aa22 b cc"
str = "66dd eee ff"
# => ""
答案 2 :(得分:0)
通常不止一种方式来匹配模式,尽管有些方法比其他模式更简单。与您的输入和预期输出一起使用的相对简单的常规快递如下:
/(?:(?:\A|\s*)\p{L}\S*)+/
当满足以下所有条件时,匹配一个或多个字符串:
列表中的第一个项目是第二个非捕获组,它允许重复匹配,直到一个单词以非字母开头。
regex = /(?:(?:\A|\s*)\p{L}\S*)+/
regex.match 'aa22 b cc 33d ff' #=> #<MatchData "aa22 b cc">
regex.match 'abc def 123ffg' #=> #<MatchData "abc def">
regex.match '66dd eee ff' #=> #<MatchData "">