如何提取单个单词以字母开头的字符串部分?

时间:2017-08-16 22:56:36

标签: ruby string parsing

我正在使用Ruby 2.4。假设我有一个包含多个空格的字符串

str = "abc def 123ffg"

如何捕获以字母开头的字符串开头的所有连续单词?例如,在上面,我想要捕获

"abc def"

如果我有一个像

这样的字符串
"aa22 b    cc 33d  ff"

我想抓拍

"aa22 b    cc"

但如果我的字符串是

"66dd eee ff"

我想要什么都不返回,因为该字符串的第一个单词不以字母开头。

3 个答案:

答案 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*)+/

当满足以下所有条件时,匹配一个或多个字符串:

  1. 字符串开头,或零个或多个空格字符
  2. 后跟一个Unicode类别&#34;字母&#34;
  3. 后跟零个或多个非空格字符
  4. 列表中的第一个项目是第二个非捕获组,它允许重复匹配,直到一个单词以非字母开头。

    证据

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