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。关键是带引号的字符串问题已经消失了。