【问题标题】:Regex to replace first lowercase character in a line into uppercase正则表达式将一行中的第一个小写字符替换为大写
【发布时间】:2019-09-07 07:19:08
【问题描述】:

我有一个包含数千个句子的非常大的文件。在所有这些中,每个句子的第一个单词都以小写字母开头,但我需要它们以大写字母开头。

我浏览了该网站,试图找到一个正则表达式来执行此操作,但我无法做到。我在这个过程中学到了很多关于正则表达式的知识,这对我的工作来说总是一个加分项,但我无法找到我正在寻找的具体内容。

我试图从几个答案中找到一种编译代码的方法,包括以下内容:

但由于不同的原因,它们都没有达到我的目的。

我正在使用一个接受正则表达式的特定于翻译的应用程序。

你认为这可能吗?这将节省我数小时的繁琐工作。

【问题讨论】:

  • 匹配 ^[^a-z]*[a-z] 并替换为 \U$0? (您需要一个支持\U 的编辑器)
  • 如果您的编辑器不支持它,编写脚本(例如在 Python 中)很容易实现您想要的。
  • @CertainPerformance 看起来它不支持 \U :/。此外,当使用 ^[^a-z]*[a-z] 正则表达式时,我得到每个小写字符,而不仅仅是每行第一个单词中的第一个小写字符。我不知道我的编辑器是否受到某种限制。
  • 如果您的编辑器将 all 小写字符与该模式匹配,则您的编辑器的正则表达式引擎可能已损坏。我发布的模式对我来说效果很好。如果您发布示例输入和预期输出,这将有很大帮助
  • 预期输入:正则表达式可以让我的工作更轻松 预期输出:正则表达式可以让我的工作更轻松 再次感谢!

标签: regex text replace editor


【解决方案1】:

您可以使用这个正则表达式来搜索句子的第一个字母:

(?<=[\.!?]\s)([a-z])

它匹配一个小写字母[a-z],跟在前一个句子的结尾(可能以下列之一结尾:[\.!?])和一个空格字符\s

然后用\U$1替换。

它不仅仅适用于第一句话。我故意让正则表达式保持简单,因为手动将第一个字母大写很容易。

工作示例https://regex101.com/r/hqwK26/1

UPD:如果您的软件不支持\U,您可能需要将文本复制到 Notepad++ 并在那里进行替换。 \U 完全支持,刚刚检查过。

UPD2: 根据 cmets 的说法,任务略有不同,只是每行的第一个字母要大写。

有一个简单的正则表达式:^([a-z]),具有相同的替换模式。

这是一个工作示例https://regex101.com/r/hqwK26/2

【讨论】:

  • 感谢 Ildar,看起来这非常接近我的需要。但是所有的句子都以单词小写开头,我需要每个第一个单词都大写,而不是前一个句子结尾之后的单词。你认为有可能吗?对,我的软件不支持\U。我需要找到替代解决方案。
  • @CanoEE 你能举个例子吗?有点不清楚。
  • 是的,应该如下: 预期输入:正则表达式可以让我的工作更轻松 预期输出:正则表达式可以让我的工作更轻松 它只是一个以小写开头并以句点结尾的句子列表。我只需要将每个句子的第一个单词的第一个字母(示例中的正则表达式)从小写更改为大写(正则表达式将是预期的输出。再次感谢!
  • @CanoEE 请在此处查看示例:regex101.com/r/hqwK26/2。如果这是您需要的,我会继续更新答案。
  • 太棒了!正是如此,谢谢一百万!我的软件不允许我使用\u,我想没有其他方法可以不复制到记事本,对吗?非常感谢您的帮助!!!
【解决方案2】:

采用 Ildar 的答案并结合他的两种模式应该不会妥协。 (?<=[\.!?]\s)([a-z])|^([a-z]) 这基本上是说,如果第一个模式或第二个模式。但是因为您现在在技术上提取 2 个组而不是一个,所以您必须将第 2 组称为$2。这应该没问题,因为应该只匹配其中一种模式。 所以你的替换模式将如下所示...... \U$1$2

这是一个工作示例,再次基于 Ildar 的回答... https://regex101.com/r/hqwK26/13

【讨论】:

  • 欢迎堆栈溢出。请考虑在此处提供的空间中发布您的示例,而不是外部链接。
猜你喜欢
  • 2019-05-15
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 2019-09-19
  • 1970-01-01
相关资源
最近更新 更多