【问题标题】:Search and Replace a character inside uppercase strings搜索和替换大写字符串中的字符
【发布时间】:2015-03-19 15:42:41
【问题描述】:

我有一个巨大的文本文件,其中包含许多小写和大写字符混合的拼写错误,但只有字母“l”(小写 L)并且只能在大写单词中,格式如下:

VERONlCA、SPEAKlNG、LMITATlON、英语

所以我只想替换大写单词中的所有字符“l”(小写 L)(因为有很多小写单词包含小写“L”以及以正常方式),其中前一个字符是大写字母,而连续字符也是大写的。类似于 [AZ] [l] [AZ] 并将小写字母“L”替换为大写字母“I”(如在 MIKE 中),但保持大写单词的其余部分完好无损,并且不会影响整个其余部分的小写字符串文档(所以 'imagination' 不会变成 'ImagInation')。

我正在使用查找和替换框,那么我应该在查找框中输入什么内容以及在替换框中输入什么内容?

【问题讨论】:

    标签: regex


    【解决方案1】:

    ([A-Z]|\b)l([A-Z]) 替换为\1L\2。斜线引用组。

    也可能是$1L$2,具体取决于程序。

    【讨论】:

    • 感谢您的及时响应,但是您的表达式也在选择小写字符串,例如 Cleveland,就好像它没有强制大写条件一样。另外,小写 L 在哪里开始像 lMAGINATION 这样的单词呢?我想,它应该寻找 [任何大写字母] 和 (小写 L) 或 (小写 L) 和 [任何大写字母]
    • @mistervela 你用的是什么文本编辑器?您可能需要勾选区分大小写。
    • 好的,谢谢。我想通了。我把答案贴出来了,说不定你会知道如何结合这两种表达方式。
    • @mistervela 您可以使用\b 来匹配单词边界,看看更新版本是否有效。
    【解决方案2】:

    我发现无论您使用什么软件来搜索和替换,都必须检查“匹配案例”。

    首先,我最终使用了两个正则表达式命令:

    寻找

    ([A-Z])l([A-Z]+) 
    

    替换为

    $1I$2
    

    有了这个,你确保只对大写单词执行更改,小写单词将被完全保留,因为 [AZ]+ 将确保小写 L 旁边的连续字符为大写,没有它,它将匹配也是小写单词。

    (l)([A-Z]+) 
    

    替换为

    I$2
    

    确保它匹配以小写 L 开头的单词。

    我确信有一种方法可以将这两个命令合二为一,但我不知道。

    【讨论】:

      【解决方案3】:

      如果你想处理前导和尾随l,你可以这样做:

      查找:\b(?:([A-Z]+)l([A-Z]+)|l([A-Z]+)|[A-Z]+l)\b
      替换:\U$0

      【讨论】:

      • 太好了,谢谢。但是,您的表达式并不强制仅在大写单词中进行搜索,因此我将其添加到 [AZ]+ 部分,如下所示: (?
      • @mistervela:它匹配l 仅当前面或后面跟着大写或两者时,即。 ABCllDEFABClDEF,这不是你想要的吗?
      • 是的,但是您的表达式不会仅在大写单词中进行搜索,它需要所有出现小写 L 的单词大写和小写:abclef 和 A​​BClEF。这就是为什么通过添加 [A-Z]+ 可以确保单词的其余部分只有大写字母。您的答案很棒,因为它结合了我试图执行的两个命令(开头和结尾的小写 L )
      • @mistervela:不,它只匹配我在之前评论中写的内容。它不匹配仅小写的单词。可能是您的正则表达式风格不支持环视。
      • 您使用的是什么文本编辑器?也许我的已经过时了。在我的文本编辑器中,即使我勾选了“匹配大小写”复选框,您的表达式也会匹配所有单词中的所有小写 L,大写和小写。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-02
      • 2015-09-10
      • 2015-10-03
      • 1970-01-01
      相关资源
      最近更新 更多