Regex 正则表达式:将某个单词之前的所有单词改为大写
我希望采用以下形式的字符串: 作者姓名未知长度的文章标题:some.url 只需将其更改为: 作者姓名未知长度的文章标题:some.url 我尝试了各种方法,可以成功地选择文章的标题,例如Regex 正则表达式:将某个单词之前的所有单词改为大写,regex,yahoo-pipes,Regex,Yahoo Pipes,我希望采用以下形式的字符串: 作者姓名未知长度的文章标题:some.url 只需将其更改为: 作者姓名未知长度的文章标题:some.url 我尝试了各种方法,可以成功地选择文章的标题,例如 (^.*?by) 我想用什么来代替它。e、 如果我说 replace [(^.*?by)] with [test title] 上述内容变为: 按作者姓名列出的测试标题:some.url 但是,每当我尝试用\U$1替换它时,它会使整个字符串大写,而不仅仅是匹配查询的内容 我做错了什么?顺便说一句,我是一个
(^.*?by)
我想用什么来代替它。e、 如果我说
replace [(^.*?by)] with [test title]
上述内容变为:
按作者姓名列出的测试标题:some.url
但是,每当我尝试用\U$1替换它时,它会使整个字符串大写,而不仅仅是匹配查询的内容
我做错了什么?顺便说一句,我是一个完全的regex noob,一个小时前才开始,但是任何帮助都将不胜感激
$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
编辑>
请注意guido是如何在“by”周围添加空格的,以便这个正则表达式处理“与Abby一起玩Abby:some.url”之类的事情。如果您的输入中有选项卡等,您可能希望将其替换为“\s”。不知道雅虎管道是如何工作的。最有可能的是,
将[^(.*)(?=by)]替换为[\U$1]
会起作用。无论如何,模式^(.*)(by)(.*)$
将匹配整个输入,分为三个部分,因此从这里可以很容易地找出如何重建您需要的内容,例如将[^(.*)(by)(.*)]替换为[\U$1乘\$3]
或类似的内容。这种工作方式,我遇到的问题是当我分解为这三个位时,然后让它用$1$2$3替换字符串,这样可以很好地重建字符串。如果我让它做$1$2\\U$3,它会给我在大写字母“by”之后的所有内容,但如果我做\\U$1$2$3,它会给我大写字母的全部内容。我相信Guido的答案很好,但是对于像我这样的新手来说,如果不快速分解,我就很难解码。Guido的解决方案是为perl编写的,不是yahoo管道,但包括regex shat应该可以工作。它应该转换为yahoo管道,比如用[\\U$1]替换[^(.*)(?=by)]。这只匹配(并因此替换)字符串的一部分,如果yahoo管道支持正向前瞻,应该可以工作。你能帮我把它分解一下吗?对不起,我不是一个十足的代码恐惧者,但我真的不能理解那里发生了什么。
/ 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