正则表达式:将某个单词之前的所有单词更改为大写

时间:2012-05-29 01:01:24

标签: regex yahoo-pipes

我希望采用以下形式的字符串:

文章标题未知长度作者姓名:some.url

只需将其更改为:

未知长度的作者姓名:some.url

我尝试了各种可以成功挑选文章标题的选项,例如

(^.*?by)

并将用我想要的任何东西取而代之。例如如果我说

replace [(^.*?by)] with [test title]

以上变为:

按作者名称测试标题:some.url

但是,每当我尝试用\ U $ 1替换它时,它会使整个字符串大写,而不是与查询匹配。

我做错了什么?顺便提一下,我是完整的正则表达式菜鸟,只在一小时前开始,但任何帮助都会非常感激......

2 个答案:

答案 0 :(得分:2)

$string = 'Article Title Of Unknown Length by Author Name: some.url';
$string =~ s/^(.*)(?= by )/\U\1\E/gi;
print $string; # ARTICLE TITLE OF UNKNOWN LENGTH by Author Name: some.url

编辑>

/           search for
^           at start of string 
(.*)        match and capture a group of 0+(`*`) any character (`.`)
(?= by )    followed by literal " by " (`?=` is positive lookahead)
/           replace with
\U          start upper-casing
\1          the first captured group
\E          stop upper-casing
/           options
g           search globally
i           case insensitive

答案 1 :(得分:0)

请注意guido如何在“by”周围包含空格,以便使用“Abby with Abby:some.url”等内容。如果您的输入中有选项卡,则可能需要用“\ s”替换它们。不确定雅虎管如何工作。最有可能replace [^(.*)(?= by )] with [\U$1]会做到这一点。无论如何,模式^(.*)( by )(.*)$将匹配整个输入,分为三个部分,因此从这里可以很容易地找出如何重建所需的内容,如replace [^(.*)( by )(.*)$] with [\U$1 by \$3]或其他类似内容。