43

我正在使用 Notepad++ 在 5453 行语言文件中进行一些文本替换。文件行的格式是:

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

双撇号是故意的。

我需要将值转换为句子大小写,除了“Here”和“Really”这两个词是正确的并且应该保持大写。如您所见,值中的大小写通常一开始是混合的。

我已经为此工作了一段时间。到目前为止,我所拥有的是:

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

这似乎至少选择了正确的字符串。替换件是我苦苦挣扎的地方。

4

4 回答 4

162
Find:    (. )([A-Z])(.+)
Replace: \1\U\2\L\3

在 Notepad++ 6.0 或更高版本中(带有内置的PCRE支持)。

于 2013-05-30T07:28:15.980 回答
12

正则表达式替换无法在匹配项上执行功能(如大写)。您必须编写脚本,例如在 PHP 或 JavaScript 中。

更新:乔纳斯的回答

我为自己构建了一个名为Text Utilities的网页来执行此类操作:

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

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

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

也许添加一些代码来大写一些像“真的”和“这里”这样的词。

于 2009-06-24T15:55:23.523 回答
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”解释了所有提供的函数,包括在“编辑器”对象下定义的 pymlsearch/pymlreplace 函数。

当您准备好运行脚本时,首先转到您希望它运行的文件,然后转到 Python 脚本菜单中的“脚本 >”并运行您的脚本。

注意:虽然如果你搞砸了,你可能可以使用 notepad++ 的撤消功能,但最好先将文本放在另一个文件中以验证它是否有效。

PS您可以使用notepad ++的内置查找对话框“查找”和“标记”每个出现的正则表达式,如果您可以全部选择它们,您可以使用TextFX的“Characters->UPPER CASE”功能来解决这个特定问题,但我'不确定如何从标记或找到的文本转到选定的文本。但是,我想我会发布这个,以防有人这样做......

编辑:在 Notepad++ 6.0 或更高版本中,您可以使用“PCRE(Perl 兼容正则表达式)搜索/替换”(来源: http: //sourceforge.net/apps/mediawiki/notepad-plus/ ?title=Regular_Expressions )所以这可以已使用(. )([A-z])(.+)带有替换参数的正则表达式(如\1\U\2\3.

于 2013-02-19T20:51:42.170 回答
4

提问者想到了一个非常具体的案例。作为记事本++中的一般“更改句子大小写”,第一个正则表达式建议对我来说不起作用。虽然不完美,但这是一个经过调整的版本,对我来说是对原始版本的重大改进:

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

您仍然对小写名词、名称、日期、国家等有疑问,但一个好的拼写检查器可以帮助解决这个问题。

于 2015-01-31T01:43:29.237 回答