在Ruby中返回匹配字符串之前的字符串

24
怎样返回一个字符串中第一次出现 "#""Apt" 之前的部分?
我知道可以通过以 "#""Apt" 作为分隔符将字符串拆分成数组,并调用 .first 方法,但肯定有更简单的方法。
4个回答

53

字符串分割比尝试使用正则表达式提取字符串部分肯定更容易和更可读。对于后一种情况,你需要使用捕获组来获取第一个匹配项。它与字符串分割相同。

string.split(/#|Apt/, 2).first

4
由于您只需要第一个结果,因此将2作为split的第二个参数(表示最多分成两部分)是值得的。否则,这可能会比必要的工作量多得多。 - Dan Tao
有趣的事实:name,token,rest =“Jane Doe#331-456”。split(/ \ s *(#| Apt)/,2) #name =“Jane Doe”,token =“#”,rest =“331-456” - sj26

3

我会写一个方法来使它更清晰易懂。例如,像这样:

class String
    def substring_until(substring)
        i = index(substring)
        return self if i.nil?
        i == 0 ? "" : self[0..(i - 1)]
    end
end

2

使用 String#[] 方法。像这样:

[
  '#foo',
  'foo#bar',
  'fooAptbar',
  'asdfApt'
].map { |str| str[/^(.*)(#|Apt)/, 1] } #=> ["", "foo", "foo", "asdf"]

1

我不经常用Ruby编写代码,但我相信你可以使用类似于正则表达式的方法。

^.*(#|Apt)

或者,如果你把字符串放入一个分词器中,你可以对它进行一些操作,但是考虑到你正在寻找一个单词而不仅仅是一个单个字符,这可能会更加困难。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接