Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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# 使用Regex或XmlParser替换标记中不包含的文本_C#_Regex_Html Parsing_Xml Parsing_Regex Negation - Fatal编程技术网

C# 使用Regex或XmlParser替换标记中不包含的文本

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 = "(?

我知道使用正则表达式来解析或操作HTML/XML是个坏主意,我通常不会这么做。但考虑到缺乏替代品

我需要使用C#替换字符串中尚未包含的文本(理想情况下是具有特定id的span标记)

例如,假设我想用替换文本(在我的例子中是另一个span)替换以下文本中不在span内的所有ABC分期

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);