C#在更改其他值时忽略语音内部

C#在更改其他值时忽略语音内部,c#,ignore,speech,C#,Ignore,Speech,我正在尝试制作一个基本的转换器,它可以更改代码中的值,例如,可能是:,e.t.c,我可以使用 if(code.Contains(".")) { code.Replace(".", "::"); } 但我的问题是,我不知道如何在演讲中忽略它,就好像这个句子是“Hello.”,可以翻译成“Hello::”。我怎样才能阻止这一切?(我知道您可以使用正则表达式来查找文本中的语音)您可能可以使用正则表达式来帮助您,但它会相当复杂,而且性能很差。您也可以这样做: var sb = new St

我正在尝试制作一个基本的转换器,它可以更改代码中的值,例如,
可能是
,e.t.c,我可以使用

if(code.Contains("."))
{
      code.Replace(".", "::");
}

但我的问题是,我不知道如何在演讲中忽略它,就好像这个句子是“Hello.”,可以翻译成“Hello::”。我怎样才能阻止这一切?(我知道您可以使用正则表达式来查找文本中的语音)

您可能可以使用正则表达式来帮助您,但它会相当复杂,而且性能很差。您也可以这样做:

var sb = new StringBuilder();
bool insideSpeech = false;
foreach(char c in code) {
    if(c == '"') {
        insideSpeech = !insideSpeech;
    }
    if(c == '.' && !insideSpeech) {
        sb.Append("::");
    } else {
        sb.Append(c);
    }
}
code = sb.ToString();

你在这里要做的事情比你意识到的要复杂得多

编程语言的区别不仅仅是外观,它们有不同的能力和语法规则,即使是两个类似于C和C++的两个。除了C#。相当于。->和::在C++中。关于指针也有不同的规则,有时会出现一些问题,比如指针指向指针,更不用说*和&符号可以是二进制算术/逻辑运算,也可以是指针运算,具体取决于它们的用途。还有一些问题涉及到const、auto和sizeof等关键字

简言之,除非您准备编写一个合适的标记器,否则您将无法正确地完成这项工作。要正确地将一种编程语言翻译成另一种编程语言,您至少需要编写完整编译器的一大块,这是一门专业课程

我建议您在进一步研究之前,先对标记器和词汇分析进行一些研究

作为一个提示,你会发现更容易将你的代码分割成一个字符数组,同时处理一个字符,同时跟踪程序的状态(即,你当前在一个字符串的中间,你是否在两个括号中间,你遇到了多少个嵌套级别)。通过这样做,您至少可以设法改变表面层次的差异(而不是更深层次的差异,如关键字和键入)

编辑:

编写标记器和编译器的一些有用资源:


我根据经验说话,就像我最近尝试编写自己的编译器(用C#)一样,但由于有更重要的事情阻碍,我将项目搁置。

sb.Append(code[I])
是错误的,因为您正在使用for循环,而您正在使用foreach循环。它应该是
sb.Append(c)