正则表达式转换为句子格式

44

我正在使用Notepad ++对一份包含5453行语言文本的文件进行一些文本替换。该文件的行格式如下:

variable.name = Variable Value Over Here, that''s for sure, Really

双撇号是有意为之。

我需要将值转换为句子形式,除了"Here"和"Really"这两个词应该保持大写外,其余单词都应该转换为小写。如你所见,值内的大小写通常是混合的。

我已经花了一点时间来处理这个问题,目前为止我只有:

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

这似乎至少选择了正确的字符串。我遇到问题的是替换部分。


9
“Here”和“Really”为什么是合适的用词? - user447688
4个回答

163
Find:    (. )([A-Z])(.+)
Replace: \1\U\2\L\3
在Notepad++ 6.0或更高版本中(该版本内置PCRE支持)。

2
哇,我很久以前就想要这样的东西了。谢谢! - Brad Cupit
29
我会补充一下,\u 仅将匹配的字符串的第一个字符变成大写,同样地,\l 也只将第一个字符变成小写。 - Brad Cupit
10
这应该是答案。 - sonnb
22
如果您正在使用\U和\L命令,您也可以使用\E来结束它们。例如,如果您只想更改替换字符串的一部分而不是全部内容,则需要在想要更改大小写的部分结尾处放置一个\E。 - Tom Carpenter
4
需要注意的是,在至少版本6.9.1中,\U和\L(以及\u、\l)命令并不会转换重音字母,只会转换ASCII编码的大写/小写字母。 - John C
显示剩余5条评论

12

正则表达式替换不能对匹配项执行函数(例如大写)。您需要编写脚本,例如使用 PHP 或 JavaScript。

更新:请参见Jonas'答案

我建了一个名为Text Utilities的网页来完成这种操作:

  • 粘贴您的文本
  • 进入“查找、正则表达式和替换”(或按Ctrl+Shift+F
  • 输入您的正则表达式(我的是^(.*?\=\s*\w)(.*)$
  • 勾选“^$匹配行限制”选项
  • 选择“将JS函数应用于匹配项”
  • 添加参数(第一个是匹配项,然后是子模式),这里是s、start、rest
  • 将返回语句更改为return start + rest.toLowerCase();

文本区域中的最终函数如下:

return function (s, start, rest) {
     return start + rest.toLowerCase();
};

或许可以添加一些代码,将像"Really"和"Here"这样的单词大写。


感谢streetpc的帮助。在Notepad++中,我可以使用正则表达式应用替换函数,这真是太棒了。再说一遍,你的网站也很棒。这基本上解决了问题,除非变量部分内有新的句子,但我可以通过查找“。[a-z]”并修复紧跟句点空格组合后第一个字母的大小写来解决这个问题。我会让问题保持开放状态一段时间,看看是否有任何Notepad++用户回复,但你绝对解决了我的问题。谢谢! - jkramp
这可以在Vim中完成。http://vim.wikia.com/wiki/Changing_case_with_regular_expressions - MaxH
nedit也可以使用其正则表达式搜索和替换来完成此操作。 - metal

5
在Notepad++中,您可以使用名为PythonScript的插件来完成此任务。如果您安装了该插件,请按如下方式创建一个新脚本:
然后您可以使用以下脚本,根据需要替换正则表达式和函数变量:
import re

#change these
regex = r"[a-z]+sym"
function = str.upper

def perLine(line, num, total):
for match in re.finditer(regex, line):
    if match:
        s, e = match.start(), match.end()
        line = line[:s] + function(line[s:e]) + line[e:]
        editor.replaceWholeLine(num, line)

editor.forEachLine(perLine)

这个例子的工作方式是找到特定行中的所有匹配项,然后对每个匹配项应用该函数。如果您需要多行支持,则Python脚本“Conext-Help”解释了所有提供的功能,包括在“editor”对象下定义的pymlsearch/pymlreplace函数。
当您准备运行脚本时,请先转到要运行脚本的文件,然后转到Python脚本菜单中的“Scripts>”并运行您的脚本。
注意:如果出错,您可能可以使用notepad ++的撤消功能,但最好将文本先放入另一个文件以验证其是否有效。
另外,您可以使用notepad ++的内置查找对话框“查找”和“标记”正则表达式的每个出现次数。如果您能够选择它们所有,您可以针对此特定问题使用TextFX的“字符->大写”功能,但我不确定如何从标记或找到的文本转换为选定的文本。但是,我还是想把这个发布出来,以防有人这样做...
编辑:在Notepad ++ 6.0或更高版本中,您可以使用“PCRE(Perl兼容正则表达式)搜索/替换”(来源:http://sourceforge.net/apps/mediawiki/notepad-plus/?title=Regular_Expressions)。因此,可以使用类似于(. )([A-z])(.+)的正则表达式以及类似于\1\U\2\3的替换参数来解决此问题。

对于那些寻找好的 PCRE 搜索和替换语法(包括大小写转换等)参考资料的人,可以查看这个 Perldoc 网站:http://perldoc.perl.org/perlre.html -- 我没有找到其他地方记录像 \U 这样的东西! - Peter Mularien

4

提问者有一个非常具体的案例。 作为在notepad++中进行“句子大小写更改”的一般性操作, 第一个正则表达式建议对我来说并不完全有效。 尽管不是完美的,但以下是一个调整后的版本, 对于我的目的而言比原始版本有了很大的改进:

find:    ([\.\r\n][ ]*)([A-Za-z\r])([^\.^\r^\n]+) 
replace: \1\U\2\L\3

您仍然存在小写名词、名称、日期、国家等问题,但是好的拼写检查工具可以帮助解决这些问题。


谢谢!这对我很有用。我需要将一堆变量名从下划线改为驼峰式,然后在Sublime中搜索表达式(.+)_(.+)(<-这不是小怪兽的眼睛),并用$1\U$2替换它。 - Eugenio

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