Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式:将某个单词之前的所有单词改为大写_Regex_Yahoo Pipes - Fatal编程技术网

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

Regex 正则表达式:将某个单词之前的所有单词改为大写,regex,yahoo-pipes,Regex,Yahoo Pipes,我希望采用以下形式的字符串: 作者姓名未知长度的文章标题:some.url 只需将其更改为: 作者姓名未知长度的文章标题:some.url 我尝试了各种方法,可以成功地选择文章的标题,例如 (^.*?by) 我想用什么来代替它。e、 如果我说 replace [(^.*?by)] with [test title] 上述内容变为: 按作者姓名列出的测试标题:some.url 但是,每当我尝试用\U$1替换它时,它会使整个字符串大写,而不仅仅是匹配查询的内容 我做错了什么?顺便说一句,我是一个

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

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

只需将其更改为:

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

我尝试了各种方法,可以成功地选择文章的标题,例如

(^.*?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