Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c“替换表达式”;除非;_C#_Replace_Substring - Fatal编程技术网

C# c“替换表达式”;除非;

C# c“替换表达式”;除非;,c#,replace,substring,C#,Replace,Substring,我正在尝试重拼字符串的子字符串,例如 this is some weird text that I want to format text for some ='custom text' content "text" ="text"... 结果应该是 this is some weird sentence that I want to format sentence for some ='custom text' content "sentence" ="text"... 我想将所有出现的文

我正在尝试重拼字符串的子字符串,例如

this is some weird text that I want to format text for some ='custom text' content "text" ="text"...
结果应该是

this is some weird sentence that I want to format sentence for some ='custom text' content "sentence" ="text"...
我想将所有出现的
文本
替换为
句子
,除非出现的内容包含在
='.''.
='.'.'.

处理准确引用的事件(即
=“test”
=“test”
)相当容易,但我被包含的部分卡住了

我考虑过Regex,但我对它们不够熟悉,无法成功…

(?(然后不是另一个撇号)…与
相同。如果它发现后面有匹配项,它基本上会拒绝匹配项

(?<!\=\s*?(\'[^']*)|(\"[^"]*))text
这仍然相对脆弱,可能会被转义引号或不匹配的引号破坏,但根据您的数据,这可能是可以接受的。它肯定会在人工监督下工作

如果像
Data='Bob说“Mary还不在这里”text'
这样的字符串是一个严重的问题,我将跳过regex方法

请点击此处查看:

我知道这看起来不像,但你正在设计一种语言。事实上,这是一种非常简单的字符串处理语言。因此,像设计编程语言一样处理问题。你的工作流程应该是:

  • 将输入字符串Lex转换为一系列标记
  • 使用您的规则转换令牌序列
  • 将令牌序列转换回字符串
第一个很难,但没那么难,你可以做到

您的lexer可以建模为状态机。即:

  • 我们跟踪“当前状态”
  • 我们处理每个角色,一次一个
  • 处理过程只取决于两件事:它是什么角色,我们处于什么状态
  • 这会产生两件事:(1)新的当前状态(可能与旧状态相同)和(2)决定是或否,我们是否在令牌边界上
  • 如果我们在令牌边界上,那么我们将向令牌列表添加一个新令牌
当我们处理完每个字符后,我们就有了一个标记列表

让我们来看一些典型的lexer规则作为例子。我们总是从以下几个州开始:

  • 有四种状态:正常、相等、单一和双重
  • 我们在正常状态下开始
现在说说在每个州该做什么:

  • 在正常状态下,如果您得到一个
    =
    ,如果有,则结束当前令牌,启动一个新的Equals令牌,将
    =
    添加到它,然后转到Equals状态。否则,如果有,则将该字符添加到当前令牌,如果没有,则创建一个新的正常令牌
  • 在Equals状态下,结束当前令牌。如果您得到一个
    则转到Single state并创建一个令牌。如果您得到一个
    ,创建一个双令牌并转到双状态。如果您得到一个
    =
    ,则创建一个等于令牌并保持等于状态。否则,创建一个正常令牌并返回正常状态。将该字符添加到当前令牌
  • 在单一状态下,将字符添加到当前标记。如果您获得
    ,则转到正常状态。否则,保持单一状态
  • 对于双重状态也是如此
  • 如果已用完字符,请结束当前令牌
以此类推。你看这是怎么回事。我们有一个非常简单的小机器,它只需要检查所有字符,决定我们到目前为止看到的文本类型,以及是否在这一点上分解它。你最终得到一个令牌列表,其中每个令牌都有一部分字符串

现在,您可以在普通令牌上进行搜索和替换,知道您不会在任何单令牌、双令牌或相等令牌上进行替换


然后把被替换的字符串按同样的顺序放在一起,你就完成了。

什么是“上下文”?是否应该用“句子”替换“文本”并获得“一致性”?你在为自己的缺陷设置自己。考虑写一个词汇表。,听起来像是#metoo运动的产物。我不明白为什么在你的例子中,
内容“text”
被替换。你说如果
文本是引号中的,你不想替换。那么
text=“text='text=”呢text='text
?其中有多少被替换,原因是什么?您的问题没有明确说明。您正在这里设计一种编程语言,所以请小心操作。@EricLippert看起来规则是它包含在引号中(单引号或双引号)前缀是
=
我认为普通标记也需要一个单词边界规则来结束当前标记/启动下一个普通标记,对吗?否则我会期望对单词进行不正确的替换,比如借用你的例子,
context
@JonathonChase:对,这会使问题复杂化,但会减少com应用到普通令牌。这个问题可以在普通令牌上解决,也可以改进lexer。关键是带引号的字符串问题已经消失了。