C# 使用Regex或XmlParser替换标记中不包含的文本
我知道使用正则表达式来解析或操作HTML/XML是个坏主意,我通常不会这么做。但考虑到缺乏替代品 我需要使用C#替换字符串中尚未包含的文本(理想情况下是具有特定id的span标记) 例如,假设我想用替换文本(在我的例子中是另一个span)替换以下文本中不在span内的所有ABC分期C# 使用Regex或XmlParser替换标记中不包含的文本,c#,regex,html-parsing,xml-parsing,regex-negation,C#,Regex,Html Parsing,Xml Parsing,Regex Negation,我知道使用正则表达式来解析或操作HTML/XML是个坏主意,我通常不会这么做。但考虑到缺乏替代品 我需要使用C#替换字符串中尚未包含的文本(理想情况下是具有特定id的span标记) 例如,假设我想用替换文本(在我的例子中是另一个span)替换以下文本中不在span内的所有ABC分期 ABC必须替换行首或此处的ABC,但不能用任何东西替换跨度内的ABC。此处的另一个ABC也必须替换此ABC 我尝试使用带有前瞻和回顾断言的正则表达式。各种各样的组合 string regexPattern = "(?
ABC必须替换行首或此处的ABC,但不能用任何东西替换跨度内的ABC。此处的另一个ABC也必须替换此ABC
我尝试使用带有前瞻和回顾断言的正则表达式。各种各样的组合
string regexPattern = "(?<!id=\"__publishingReusableFragment\").*?" + stringToMatch + ".*?(?!span)";
string regexpatern=“(?”+inputString+@”);
XmlWriter requiredWriter=xel.CreateWriter();
我希望以某种方式使用writer来获取不属于节点的字符串并替换它们
基本上,我愿意接受任何解决这个问题的建议/解决方案
提前谢谢你的帮助。我知道这有点难看,但这会管用的
var s =
@"ABC at start of line or ABC here must be replaced but, <span id=""__publishingReusableFragment"" >ABC inside span must not be replaced with anything. Another ABC here </span> this ABC must also be replaced";
var newS = string.Join("</span>",s.Split(new[] {"</span>"}, StringSplitOptions.None)
.Select(t =>
{
var bits = t.Split(new[] {"<span"}, StringSplitOptions.None);
bits[0] = bits[0].Replace("ABC","DEF");
return string.Join("<span", bits);
}));
var s=
@“必须更换线路起点的ABC或此处的ABC,但不得用任何东西替换跨度内的ABC。此处的另一个ABC也必须更换此ABC”;
var newS=string.Join(“,s.Split(新[]{”“},StringSplitOptions.None)
.选择(t=>
{
var bits=t.Split(new[]{“我知道它有点难看,但这会起作用
var s =
@"ABC at start of line or ABC here must be replaced but, <span id=""__publishingReusableFragment"" >ABC inside span must not be replaced with anything. Another ABC here </span> this ABC must also be replaced";
var newS = string.Join("</span>",s.Split(new[] {"</span>"}, StringSplitOptions.None)
.Select(t =>
{
var bits = t.Split(new[] {"<span"}, StringSplitOptions.None);
bits[0] = bits[0].Replace("ABC","DEF");
return string.Join("<span", bits);
}));
var s=
@“必须更换线路起点的ABC或此处的ABC,但不得用任何东西替换跨度内的ABC。此处的另一个ABC也必须更换此ABC”;
var newS=string.Join(“,s.Split(新[]{”“},StringSplitOptions.None)
.选择(t=>
{
var bits=t.Split(新[]{“resultString=Regex.Replace(subjectString,
@"(?
如果正则表达式前面没有开头的resultString=regex.Replace(subjectString,
@"(?
正则表达式匹配ABC
,如果前面没有开头看起来不错。但是如果span标记中有一些额外的属性,该怎么办?例如:……我尝试如下替换正则表达式的span部分,但现在在span标记结束后它不匹配-……这个ABC…您开始了解解析HT的所有原因带有正则表达式的ML不是一个好主意。如果您的属性从不包含
,则可以使用]*id=“\uu publishingReusableFragment”“[^>]*>
希望一切顺利。是的,就是这样,谢谢。是的,这就是为什么我希望使用LinqToXML或一个好的LinqToHtml库来实现它可能是一个好主意。这只是一个一次性的导入工具,需要在导入过程中咀嚼一些数据,以减少手动后期处理。看起来不错。但是如果我有一些额外的属性呢span标记例如:……我尝试按如下方式替换正则表达式的span部分,但现在它在span标记结束后不匹配-……这个ABC…您开始遇到使用正则表达式解析HTML不是一个好主意的所有原因。如果您的属性从不包含
,则可以使用]*id=“”__正在发布可重用片段“”[^>]*>
希望一切顺利。是的,就是这样,谢谢。是的,这就是为什么我希望使用LinqToXML或一个好的LinqToHtml库来实现它可能是一个好主意。这只是一个一次性的导入工具,需要在导入过程中咀嚼一些数据,以减少手动后期处理。一点也不难看。这是一种完成需要的工作的好方法要完成(这有点难看)。唯一的问题是它忽略了所有跨度。不仅仅是带有特定id的跨度,比如正则表达式。这可能已经扩展到适合我,并且在很多其他情况下会有所帮助。一点也不难看。这是一种完成需要完成的事情的好方法(这有点难看)。唯一的问题是它忽略了所有的跨距。不仅仅是带有特定id的跨距,比如正则表达式。这可能已经扩展到适合我,并且在许多其他情况下会有所帮助。
resultString = Regex.Replace(subjectString,
@"(?<! # assert that we can't match the following
# before the current position:
# An opening span tag with specified id
<\s*span\s*id=""__publishingReusableFragment""\s*>
(?: # if it is not followed by...
(?!<\s*/\s*span) # a closing span tag
. # at any position between the opening tag
)* # and our text
) # End of lookbehind assertion
ABC # Match ABC",
"XYZ", RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);