我正在寻找替换大(~1mb)字符串的多个(~500)子串的最快方法.无论我尝试过什么,似乎String.Replace是最快的方式.
我只关心最快的方式.不是代码可读性,可维护性等.我不在乎我是否需要使用不安全的代码或预处理原始字符串.
编辑:评论后我添加了一些细节:
每次替换迭代都会将字符串上的ABC替换为其他字符串(每次替换迭代次数不同).要替换的字符串总是相同的 - ABC将始终是ABC.从不ABD.因此,如果有400.000数千个替换迭代.每次使用相同的字符串 - ABC - 将替换为其他(不同的)字符串.
我可以控制ABC是什么.只要它不影响结果,我可以使它超短或超长.显然,ABC不能打招呼,因为大多数输入字符串中都会出现hello.
输入示例: ABCDABCABCDABCABCDABCABCDABCD
示例替换为字符串: BC
示例替换为字符串: AA, BB, CC, DD, EE (5 iterations)
示例输出:
AAADAAAAAADAAAAAADAAAAAADAAAD
ABBDABBABBDABBABBDABBABBDABBD
ACCDACCACCDACCACCDACCACCDACCD
ADDDADDADDDADDADDDADDADDDADDD
AEEDAEEAEEDAEEAEEDAEEAEEDAEED
Run Code Online (Sandbox Code Playgroud)
平均情况:输入字符串为100-200kb,替换迭代次数为40.000次.最坏的情况:输入字符串是1-2mb,400,000次替换迭代.
我可以做任何事.并行做,不安全等等.我不知道怎么做.重要的是它需要尽可能快.
谢谢
我在我的数据库中的字段,用户保存的自由形式的电话号码.因此,数据具有各种不同的格式:
我想去掉所有的非数字字符,只是存储的数字,但我无法找到一个简单的方法来做到这一点.是否可以不为每个字符使用一个REPLACE?
可以说我写了一个简单的CSS规则:
.star_10 {
background: url(stars.png) no-repeat 0 0;
}
Run Code Online (Sandbox Code Playgroud)
我需要10个,所以我复制了9次.
.star_10 {
background: url(stars.png) no-repeat 0 0;
}
.star_10 {
background: url(stars.png) no-repeat 0 0;
}
.star_10 {
background: url(stars.png) no-repeat 0 0;
}
.star_10 {
background: url(stars.png) no-repeat 0 0;
}
.star_10 {
background: url(stars.png) no-repeat 0 0;
}
Run Code Online (Sandbox Code Playgroud)
等等
现在我想用增量值更改star_10和0 0,所以它看起来像这样:
.star_10 {
background: url(stars.png) no-repeat 0 0;
}
.star_9 {
background: url(stars.png) no-repeat 0 -18px;
}
.star_8 {
background: url(stars.png) no-repeat 0 -36px; …Run Code Online (Sandbox Code Playgroud) 我在Objective-C中寻找一种好方法,用单词"and"替换字符串中的最后一个逗号.有什么建议?
"红色,绿色,蓝色,黄色"
变
"红色,绿色,蓝色和黄色"
我有一个RichTextBox看起来像这样:
TEXT NEXT_TEXT 10.505 -174.994 0
TEXT NEXT_TEXT 100.005 174.994 90
TEXT NEXT_TEXT -10.000 -5.555 180
TEXT NEXT_TEXT -500.987 5.123 270
TEXT NEXT_TEXT 987.123 1.000 180
TEXT NEXT_TEXT 234.567 200.999 90
Run Code Online (Sandbox Code Playgroud)
我想替换"." 没有任何东西,把它放进ListBox......
所以新文件看起来像这样:
TEXT NEXT_TEXT 10505 -174994 0
TEXT NEXT_TEXT 100005 174994 90
TEXT NEXT_TEXT -10000 -5555 180
TEXT NEXT_TEXT -500987 5123 270
TEXT NEXT_TEXT 987123 1000 180
TEXT NEXT_TEXT 234567 200999 90
Run Code Online (Sandbox Code Playgroud)
我想过将值乘以1000,但我不知道如何正确地对字符串进行匹配计算.
所以下一个想法就是这样做(但这不行):
// Splits the lines in …Run Code Online (Sandbox Code Playgroud) 我原本以为Python是一种纯粹的传递引用语言.
来自C/C++我不禁想到内存管理,而且很难把它从我的头脑中解脱出来.因此,我试图从Java的角度来考虑它,并将所有内容都考虑在内,而不是原始内容作为参考传递.
问题:我有一个列表,其中包含一组用户定义类的实例.
如果我使用for-each语法,即:
for member in my_list:
print(member.str);
Run Code Online (Sandbox Code Playgroud)
是否member相当于对象的实际引用?
它是否相当于:
i = 0
while i < len(my_list):
print(my_list[i])
i += 1
Run Code Online (Sandbox Code Playgroud)
我认为不是,因为当我想要替换时,它不起作用,也就是说,这不起作用:
for member in my_list:
if member == some_other_obj:
member = some_other_obj
Run Code Online (Sandbox Code Playgroud)
在列表中进行简单的查找和替换.可以在for-each循环中完成,如果是,怎么做?另外,我是否只需要使用随机访问语法(方括号),或者什么都不会工作,我需要删除该条目,并插入一个新条目?即:
i = 0
for member in my_list:
if member == some_other_obj:
my_list.remove(i)
my_list.insert(i, member)
i += 1
Run Code Online (Sandbox Code Playgroud) 假设我通过使用视觉选择+猛拉将3个字符"foo"拉入我的剪贴板,即:'vllly'
然后我将光标移动到第5行的另一个角色(让我们称之为这个角色x),我想用之前的东西替换,即foo.
我可以使用'p'在x之后粘贴foo,或者'P'在x之前粘贴foo,但我想用foo 替换 x.
我可以使用'vp'用foo替换x,但这只能工作一次,因为它在我的剪贴板中留下了x.换句话说,如果我移动到下一次出现的x并再次点击vp,它就不会用foo替换它.
当然,我可以通过使用:s/x/foo/gc进行搜索/替换,然后忽略我不想替换的所有x的出现,但这有点单调乏味,特别是当我需要的时候do是替换2或3次出现的x非常接近我的光标但不在同一行上(即:第2,3和7行).
所以目前我正在使用:2,7s/x/foo/gc但是我想知道是否有办法将光标移动到x并点击[在这里插入魔术按钮]以用foo替换它.然后我可以移动到我的下一次出现的x并再次点击[魔术按钮]并且繁荣,它再次用foo替换x.
尽管我很难用这个比喻,想象你输入的是记事本,然后选择3个字符,按Ctrl + c将它们复制到剪贴板中,然后高亮显示x,然后按Ctrl + v将其替换为FOO.然后突出显示另一个x,然后再次按Ctrl + v,依此类推.
我怎么在vim中这样做?
我正在导入一些具有多个string字段的记录,从旧数据库到新数据库.它看起来很慢,我怀疑是因为我这样做:
foreach (var oldObj in oldDB)
{
NewObject newObj = new NewObject();
newObj.Name = oldObj.Name.Trim().Replace('^', '?').Replace('@', 'Ž').Replace('[', 'Š')
.Replace(']', '?').Replace('`', 'ž').Replace('}', '?')
.Replace('~', '?').Replace('{', 'š').Replace('\\', '?');
newObj.Surname = oldObj.Surname.Trim().Replace('^', '?').Replace('@', 'Ž').Replace('[', 'Š')
.Replace(']', '?').Replace('`', 'ž').Replace('}', '?')
.Replace('~', '?').Replace('{', 'š').Replace('\\', '?');
newObj.Address = oldObj.Address.Trim().Replace('^', '?').Replace('@', 'Ž').Replace('[', 'Š')
.Replace(']', '?').Replace('`', 'ž').Replace('}', '?')
.Replace('~', '?').Replace('{', 'š').Replace('\\', '?');
newObj.Note = oldObj.Note.Trim().Replace('^', '?').Replace('@', 'Ž').Replace('[', 'Š')
.Replace(']', '?').Replace('`', 'ž').Replace('}', '?')
.Replace('~', '?').Replace('{', 'š').Replace('\\', '?');
/*
... some processing ...
*/
}
Run Code Online (Sandbox Code Playgroud)
现在,我已经通过网络阅读了一些帖子和文章,我已经看到了很多不同的想法.有人说如果我做正则表达式会更好MatchEvaluator,有人说最好保留原样. …
编者注:根据OP后来的评论来判断,这个问题的要点是: 如何将一个带有CRLF(Windows风格)行结尾的文件转换为PowerShell中的LF-only(Unix风格)文件?
这是我的powershell脚本:
$original_file ='C:\Users\abc\Desktop\File\abc.txt'
(Get-Content $original_file) | Foreach-Object {
$_ -replace "'", "2"`
-replace '2', '3'`
-replace '1', '7'`
-replace '9', ''`
-replace "`r`n",'`n'
} | Set-Content "C:\Users\abc\Desktop\File\abc.txt" -Force
Run Code Online (Sandbox Code Playgroud)
使用此代码,我可以将3替换为2,使用空字符串替换为7和9.我只能使用换行符替换回车换行符.但这不起作用.
我编写了一个批处理脚本来替换文本文件中的字符串.
以下是脚本.
@echo off &setlocal
set "search=%1"
set "replace=%2"
set "textfile=Input.txt"
set "newfile=Output.txt"
(for /f "delims=" %%i in (%textfile%) do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line:%search%=%replace%!"
echo(!line!
endlocal
))>"%newfile%"
del %textfile%
rename %newfile% %textfile%
Run Code Online (Sandbox Code Playgroud)
但对于12MB的文件,它需要接近7分钟.我希望它不到一分钟.我们可以使用find或findstr命令来减少所花费的时间吗?
replace ×10
c# ×3
performance ×2
string ×2
vim ×2
batch-file ×1
eol ×1
foreach ×1
list ×1
newline ×1
nsstring ×1
objective-c ×1
oracle11g ×1
powershell ×1
python ×1
reference ×1
regex ×1
richtextbox ×1