Notepad++ 大写每个单词的首字母

17

输入: "notepad++ capitalize every first letter of every word"

输出: "Notepad++ Capitalize Every First Letter Of Every Word"

我一直在尝试使用 ctrl+Fregex 将每个单词的首字母大写。

到目前为止,我一直在尝试使用查找:\b(.)\<(.) ,替换为:\u\1 ,但是这会导致所有字母都被大写。

我已经根据^(.)\u\1 来完成了我的需求,然后再用 \s\b(.)\u\1

然而,对我来说这似乎很愚蠢,因为有很多帖子谈论使用单词边界。我只是很难让它们起作用。感谢您的考虑!


除非您使用第三方插件,否则在N++中无法完成此操作。也不能使用正则表达式。 - Jorge Campos
5个回答

30

背景

根据Notepad++规范(参见替换一节),在将子字符串变成大写时有三个操作符可以使用:

\u
将下一个字符输出为大写
\U
将后面的字符全部输出为大写,直到找到\E为止。
\E
结束由\L\U引起的大小写强制模式。

因此,您可以使用\u匹配子字符串并将其首字母大写以使其大写,或者匹配字符并使用\U/\E

请注意,Unicode字符不会被转换为大写,只有ASCII字母会受影响。


Notepad++中的BOW(单词开头)Bug

请注意,目前(在Notepad ++ v.6.8.8中)某些原因导致单词开头无法正常工作。大多数引擎都适用的常见解决方案(在Sublime Text中使用它将匹配)不起作用:

\b(\w)

这个正则表达式匹配字符串中所有单词字符,不考虑它们在字符串中的位置。

我记录了一个错误与通用子模式相邻的单词边界问题 #1404


解决方案#1(适用于当前的Notepad++ v.6.8.8)

第一种解决方案是使用\w+并替换为\u$0(不需要使用任何捕获组)。尽管这并不意味着我们只匹配单词开头的字符,该模式将只匹配由单词字符组成的大块内容([a-zA-Z0-9_] + 所有Unicode字母/数字),并将第一个字符转换为大写字母。


解决方案#2(适用于当前的Notepad++ v.6.8.8)

第二种解决方案可以使用定义了特殊边界的向后查找实现:

(?:(?<=^)|(?<=\W))\w

将其替换为\U$0\E

正则表达式(?:(?<=^)|(?<=\W))\w仅匹配位于行首((?<=^))或在非单词字符后面((?<=\W))的字母数字字符。

替换字符串 - \U$0\E - 包含一个\U标志,开始将字母转换为大写,\E是一个标志,告诉Notepad++停止大小写转换。


边缘情况

如果您有连字符单词,例如well-known,并且只想将第一部分大写,可以使用[\w-]+\u$0替换。它还会保留类似于-v--help这样的字符串。


1
这比我预期的要复杂得多。谢谢。 - Francis Smart
1
如果我能给这个点赞超过200次(我需要转换的项目数量),那就太好了。它为我节省了数小时的编辑时间。谢谢! - jmcg
只是提醒一下:这仅适用于ASCII字母,使用Notepad++中的大小写交换运算符无法更改西里尔等字母。 - Wiktor Stribiżew

26

我使用的一个更简单的正则表达式:

查找:(\w+)

替换:\u$0


12

在Notepad++ v7.3.2中有一个快捷键可以将每个单词的首字母大写。

ALT + U

之前的版本不确定是否适用。


1
似乎只对所选文本起作用。此外,Ctrl+Alt+U将所选文本更改为句子大小写。 - Wiktor Stribiżew
1
完美地工作了。谢谢,兄弟。 CTRL+U则完全相反。即将“InitCap”更改为“initcap”。 - meyasir

6

将每个单词的首字母大写:使用快捷键:Alt + U

将每个单词的首字母小写:使用快捷键:Ctrl + U

快捷键适用于版本7.6.3


2

我通过记录一个使用以下替换的宏来实现类似的功能。

Find what:    ([a-z])+
Replace with: \u$0\E

Tick 'In selection'

这是我从C:\Users\%USERNAME%\AppData\Roaming\Notepad++\shortcuts.xml中提取出来的宏。

<Macro name="Title Case" Ctrl="no" Alt="no" Shift="no" Key="0">
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="([A-Z])" />
    <Action type="3" message="1625" wParam="0" lParam="2" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="\L$0" />
    <Action type="3" message="1702" wParam="0" lParam="898" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
    <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
    <Action type="3" message="1601" wParam="0" lParam="0" sParam="([a-z])+" />
    <Action type="3" message="1625" wParam="0" lParam="2" sParam="" />
    <Action type="3" message="1602" wParam="0" lParam="0" sParam="\u$0\E" />
    <Action type="3" message="1702" wParam="0" lParam="898" sParam="" />
    <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
</Macro>

额外提示:您可以使用以下代码将其添加到右键上下文菜单(contextMenu.xml)中:
<Item MenuEntryName="Macro" MenuItemName="Title Case" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接