可能重复:
StringBuilder中的正则表达式替换
如果您不介意不是一个tl;dr人,请进一步阅读以获取详细信息:
嗨,我有一个函数,对字符串进行了很多字符串操作.很自然地,我正在使用StringBuilder类.现在我陷入了两难境地.
我的功能是这样的:
ParsedText.Append("some footers here");
ParsedText.Replace("[b]","<b>"); //format all bold opens
ParsedText.Replace("[/b]","</b>"); //format all bold closes
ParsedText.Replace("\n","<br />"); //format newlines
.... sh!* load of other replaces and manipulations ...
//Add <a href> to all links
ParsedText = new StringBuilder(Regex.Replace(ParsedText, "pattern", "replacement"))
Run Code Online (Sandbox Code Playgroud)
现在,我有一个自定义的单词(模式)列表,我想要替换 - 大约20个模式..
我试图用他们各自的图像替换所有的笑脸符号; 像这样:
:) becomes <img src="smile.png" />
;) becomes <img src="wink.png" />
Run Code Online (Sandbox Code Playgroud)
等等...我有大约20个图像/符号要替换,我正在使用这个正则表达式
(?<=^|\s):d(?=$|\s) //positive lookahead and lookback at :d
Run Code Online (Sandbox Code Playgroud)
其中鲍勃谷友好提供.
所有这一切都很棒,除了,我不知道如何用StringBuilder替换正则表达式,我不想像这样创建一个新的StringBuilder:
ParsedText = new StringBuilder(Regex.Replace(...));
Run Code Online (Sandbox Code Playgroud)
我认为它击败了整个记忆保护目的二十次.
那么,在StringBuilder上进行正则表达式替换的最佳方法是什么?
谢谢!
这是一个非常基本的问题.我知道答案的范围是字符串是不可变的.Stringbuilders不是,所以你可以在最后添加字符.
那么stringbuilders如何在内部组织?String是一个字符数组.
StringBuilder也是一个字符数组吗?所以,我有一个StringBuilder MY_OBJ ="你好".现在,如果我尝试将字符附加到MY_OBJ的末尾,这是不是意味着您实际上正在创建一个新的数组对象并将所有这些字符复制到一个新的字符中?如果是这样,它如何比字符串更有效?
我想到的另一个问题是,如何标记StringBuilder的结尾?就像在C中一样,我们使用"/ 0"
我知道这string是不可变的并且StringBuilder是可变的.但任何人都可以解释下面的代码输出吗?由于两者都是参考类型,为什么它们会有不同的结果呢?
String s1 = "hello";
String s2 = "hello";
Console.WriteLine(s1 == s2); //true
Console.WriteLine(Object.ReferenceEquals(s1, s2)); //true
StringBuilder sb1 = new StringBuilder("hello");
StringBuilder sb2 = new StringBuilder("hello");
Console.WriteLine(sb1 == sb2); //false
Console.WriteLine(Object.ReferenceEquals(sb1, sb2)); //false
Run Code Online (Sandbox Code Playgroud) 我正在编写一个程序,将文件中的所有文本读入字符串,循环查看字符串,然后使用Stringbuilder将字符追加到另一个字符串.我遇到的问题是当它被写回来时,特殊字符如“和”,看起来像是�字符.我不需要进行转换,我只是希望它以我读取它的方式写回来:
StringBuilder sb = new StringBuilder();
string text = File.ReadAllText(filePath);
for (int i = 0; i < text.Length; ++i) {
if (text[i] != '{') { // looking for opening curly brace
sb.Append(text[i]);
continue;
}
// Do stuff
}
File.WriteAllText(destinationFile, sb.ToString());
Run Code Online (Sandbox Code Playgroud)
我尝试使用不同的编码(UTF-8,UTF-16,ASCII),但后来它变得更糟; 我开始得到问号符号和汉字(是的,有点霰弹枪的方法,但我只是在试验).我读过这篇文章:http://www.joelonsoftware.com/articles/Unicode.html ...但它并没有真正解释为什么我看到我所看到的,除非在C#中,读者开始切断位它击中了那样奇怪的角色.在此先感谢您的帮助!
我在下面编写了下面的Scala代码来处理我传入的String,格式化String,将其附加到a StringBuilder并将String带有转义的unicode 的格式化返回给我的调用者以进行其他处理.
Scala编译器在存在String.format以下错误的调用行时抱怨以下内容:
带备选方法的重载方法值格式:
(x$1; java.util.Locale; x$2: String, X$3: Object*)(x$1:String,x$2: Object*)无法应用字符串(*String, Int)
class TestClass {
private def escapeUnicodeStuff(input: String): String = {
//type StringBuilder = scala.collection.mutable.StringBuilder
val sb = new StringBuilder()
val cPtArray = toCodePointArray(input) //this method call returns an Array[Int]
val len = cPtArray.length
for (i <- 0 until len) {
if (cPtArray(i) > 65535) {
val hi = (cPtArray(i) - 0x10000) / 0x400 + 0xD800
val lo = (cPtArray(i) …Run Code Online (Sandbox Code Playgroud) 考虑以下输入:
String[] input = {"a9", "aa9", "a9a9", "99a99a"};
Run Code Online (Sandbox Code Playgroud)
使用StringBuilder直接替换9之前的任何数字与字母表后面的下一个字母时,最有效的方法是什么?
处理完这些输入后,输出应为:
String[] output = {"b9", "ab9", "b9b9", "99b99a"}
Run Code Online (Sandbox Code Playgroud)
我一直在摸不着头脑,而StringBuilder.setCharAt是我能想到的最好的方法.
任何建议或意见将不胜感激.
我正在写很多东西来登录突发,并优化数据路径.我用它构建日志文本StringBuilder.什么是最有效的初始容量,内存管理明智,所以无论JVM如何都能很好地工作?目标是避免重新分配几乎总是,应该由初始容量约80-100覆盖.但是我也希望浪费尽可能少的字节,因为StringBuilder实例可能会在缓冲区中出现并且会浪费掉浪费的字节.
我意识到这取决于JVM,但是应该有一些值,这会浪费最少的字节,无论JVM,还是"最小公分母".我目前正在使用128-16,其中128是一个很好的整数,减法用于分配开销.此外,这可能被认为是"过早优化"的情况,但由于我所追求的答案是一个"经验法则"数字,因此知道它在将来也会有用.
我不期待"我最好的猜测"答案(上面我自己的答案已经是这样),我希望有人已经研究过这个并且可以分享基于知识的答案.
众所周知,StringBuilder中有一个名为capacity的属性,它总是大于StringBuilder对象的长度.但是,用于什么容量?如果长度大于容量,它将被扩展.如果它做了什么,有人可以举个例子吗?
在将字符串附加到a时StringBuilder,它的容量和长度是否可以超越它MaxCapacity?
根据MSDN MaxCapacity定义为"字符串生成器实例可以容纳的最大字符数".但是这种行为在以下两个代码片段中不一致:
代码段1:在下面的代码ArgumentOutOfRangeException中,当StringBuilder的长度超过其MaxCapacity时抛出 - 这是预期的.
String str = sb.ToString();
StringBuilder sb1 = new StringBuilder(3, 5);
sb1.Append("1"); //no error as Length 1 <= max limit 5
sb1.Append("12"); //no error as Length 3 <= max limit 5
sb1.Append("123"); //ArgumentOutOfRangeException Thrown as Length 6 > max limit 5
Run Code Online (Sandbox Code Playgroud)
代码段2:在下面的代码中,ArgumentOutOfRangeException当StringBuilder的长度超过其MaxCapacity时,抛出NO - 此行为似乎不正确.
StringBuilder sb = new StringBuilder(3, 5);
sb.Append("1"); //no error as Length 1 <= max limit 5
sb.Append("2"); //no error as Length 2 <= …Run Code Online (Sandbox Code Playgroud) 我有一个tasks列表对象,我正在迭代并附加每个任务对象,StringBuilder然后是新行,如下所示.现在我将继续在同一个字符串生成器中追加任务对象,直到它达到60000字节的大小限制.一旦达到限制,我将填充此字符串作为映射中的值,键将是带增量索引的文件名.然后我将重置字符串构建器和其他东西并再次重复此过程.
因此,如果我有一个大tasks对象,那么我将拆分成多个字符串对象,其大小应始终小于60000字节.
我得到了下面的代码,但我总是看到地图中的值大小超过60000字节.我做错了什么?此外,我正在填写HashMap两个不同的地方 - 一个达到限制,另一个是如果没有达到限制.
public void populate(final List<Task> tasks) {
Map<String, String> holder = new HashMap<>();
int size = 0;
int index = 0;
StringBuilder sb = new StringBuilder();
for (Task task : tasks) {
sb.append(task).append(System.getProperty("line.separator"));
size = sb.toString().getBytes(StandardCharsets.UTF_8).length;
if (size > 60000) {
String fileName = "tasks_info_" + index + ".txt";
holder.put(fileName, sb.toString());
index++;
sb = new StringBuilder();
size = 0;
}
}
// for cases where we don't reach …Run Code Online (Sandbox Code Playgroud)