【问题标题】:Regex: Change all words before a certain one into uppercase正则表达式:将某个单词之前的所有单词更改为大写
【发布时间】:2012-05-29 01:01:23
【问题描述】:

我正在寻找形式的字符串:

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

只需将其更改为:

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

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

(^.*?by)

并将其替换为我想要的任何内容。例如如果我说

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

上面变成:

作者姓名的测试标题:some.url

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

我做错了什么?顺便说一句,我是一个完整的正则表达式菜鸟,一个小时前才开始,但任何帮助都将不胜感激......

【问题讨论】:

    标签: regex yahoo-pipes


    【解决方案1】:
    $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
    

    【讨论】:

    • 你能帮我分解一下吗?抱歉,我不是一个完全的代码恐惧症,但我无法真正了解那里发生的事情。
    【解决方案2】:

    请注意 guido 如何在“by”周围包含空格,以便此正则表达式与“Messing With Abby by Abby: some.url”等内容一起使用。如果您的输入中有标签等,您可能希望将它们替换为“\s”。不确定雅虎管道是如何工作的。 replace [^(.*)(?= by )] with [\U$1] 很可能会成功。无论如何,^(.*)( by )(.*)$ 模式将匹配整个输入,分为三个部分,所以从这里应该很容易弄清楚如何重建你需要的东西,比如replace [^(.*)( by )(.*)$] with [\U$1 by \$3] 或类似的东西。

    【讨论】:

    • 这种工作,我遇到的问题是当我闯入这 3 位,然后要求它用 $1$2$3 替换字符串时重建它很好。如果我然后让它做 $1$2\\U$3 它给了我大写“by”之后的所有内容,但是如果我做 \\U$1$2$3 它给了我大写的全部内容。我确信 Guido 的回答很棒,但对于像我这样的完全新手来说,如果不快速分解,我很难解码。
    • guido 的解决方案是为 perl 而不是 yahoo-pipes 编写的,但包含应该可以工作的正则表达式。它应该转换为像replace [^(.*)(?= by )] with [\\U$1] 这样的雅虎管道。这仅匹配(并因此替换)字符串的一部分,如果 yahoo-pipes 支持正向前瞻,则应该可以工作。
    猜你喜欢
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 2022-07-29
    相关资源
    最近更新 更多