【问题标题】:Regex replace pattern with first char of match & second char in caps正则表达式用匹配的第一个字符和大写的第二个字符替换模式
【发布时间】:2012-02-01 14:52:49
【问题描述】:

假设我有以下字符串:

"a test-eh'l"

我想将每个单词的开头大写。一个单词可以用空格、撇号、连字符、正斜杠、句号等分隔。所以我希望字符串变成这样:

"A Test-Eh'L"

我不太担心 gsub 调用中的第一个字符大写,因为事后很容易做到这一点。但是,当我一直使用 IRB 和匹配方法时,我似乎只得到一个结果。当我使用扫描时,它会收集匹配项,但问题是我不能用它做很多事情,因为我需要替换原始字符串的内容。

这是我目前所拥有的:

"a test-eh'a".scan(/[\s|\-|\'][a-z]/)
=> [" t", "-e", "'a"]

"a test-eh'a".match(/[\s|\-|\'][a-z]/)
=> #<MatchData " t"> 

如果我尝试使用 gsub 的模式:

"a test-eh'a".gsub(/[\s|\-|\'][a-z]/, $1)
TypeError: can't convert nil into String

在 javascript 中,我通常会在前面部分使用括号而不是方括号。但是,这样做时我在扫描调用中没有得到正确的结果。

"a test-eh'a".scan(/(\s|\-|\')[a-z]/)
=> [[" "], ["-"], ["'"]] 

"a test-eh'a".gsub(/(\s|\-|\')[a-z]/, $1)
=> "a'est'h'" 

任何帮助将不胜感激。

【问题讨论】:

  • 您可以像这样在替换字符串中使用第一个捕获的组:'\1'

标签: ruby regex


【解决方案1】:

试试这个:

"a test-eh'a".gsub(/(?:^|\s|-|')[a-z]/) { |r| r.upcase }
# => "A Test-Eh'A"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    相关资源
    最近更新 更多