C# 删除两个字符串之间的字符串部分

C# 删除两个字符串之间的字符串部分,c#,xml,string,C#,Xml,String,所以,我在写一个程序,我有一个xml文件,里面有攻击动作,我希望用我的值替换伤害值,我已经有了我的值,还有一个名称,示例如下 “滑车| 2d8” 现在,在我的xml文件中,它如下所示: <Move> <Name>Steamroller</Name> <Type>Bug</Type> <Frequency>EOT</Frequency> <Accuracy>2</A

所以,我在写一个程序,我有一个xml文件,里面有攻击动作,我希望用我的值替换伤害值,我已经有了我的值,还有一个名称,示例如下

“滑车| 2d8”

现在,在我的xml文件中,它如下所示:

<Move>
    <Name>Steamroller</Name>
    <Type>Bug</Type>
    <Frequency>EOT</Frequency>
    <Accuracy>2</Accuracy>
    <Range>Melee</Range>
    <Damage>1d10+10</Damage>
    <Class>Physical</Class>
    <Targets>1 Target, Pass</Targets>
    <Effect>Steamroller Flinches the target on 15-20 during Accuracy Check. If the target is Small, Steamroller deals an additional 1d10.</Effect>
    <ContestType>Tough</ContestType>
    <Appeal>3d4</Appeal>
    <ContestEffect>No Effect</ContestEffect>
    <Special />
  </Move>
  <Move>
    <Name>String Shot</Name>
    <Type>Bug</Type>
    <Frequency>At-Will</Frequency>
    <Accuracy>3</Accuracy>
    <Range>6</Range>
    <Damage />
    <Class>None</Class>
    <Targets>1 Target, Column</Targets>
    <Effect>String Shot creates a Column 2-meters wide. All Legal Targets within the Column lower their Speed 1 Combat Stage. If a target is hit by String Shot 5 times within 5 rounds of combat, they are Trapped. If a target's Speed Combat Stage has already been lowered 6 times, String Shot Traps them.</Effect>
    <ContestType>Smart</ContestType>
    <Appeal>2d4</Appeal>
    <ContestEffect>Excitement</ContestEffect>
    <Special>Threaded</Special>
  </Move>

蒸汽压路机
缺陷
EOT
2.
混战
1d10+10
物理的
1目标,传球
在精度检查过程中,蒸汽压路机将目标在15-20的位置上退缩。如果目标很小,Steamroller将额外处理1d10。
强硬的
3d4
无效
弦乐射击
缺陷
随意
3.
6.
没有一个
1目标,列
字符串快照创建一个2米宽的柱。纵队内所有合法目标降低其速度1战斗阶段。如果一个目标在5轮战斗中被弦乐射击击中5次,他们就会被困住。如果一个目标的速度战斗阶段已经降低了6次,弦乐射击会将其困住。
聪明的
2d4
兴奋
螺纹
所以基本上我想替换
之间的文本,但我不知道怎么做,目前我有两个数组,一个数组中有我的移动和它们的损坏,另一个是Xml文件移动拆分(通过使用
string.split(“”
),然后我像这样循环:

for (int index = 0; index < xmlMoves.Length; index++)
        {

            foreach (var move in myMovesArray)
            {
//myMoves.Split('|')[0] is the name of the move, 
    //i'm comparing that the move i am at in my Array is the same as the one in the Array of Xml Moves
                if (xmlMoves[index].Contains(myMoves.Split('|')[0])) 

                {
                    //Replace stuff here
                }
            }
        }
for(int index=0;index

如果有人能帮忙,那就太好了,谢谢

您可以使用向后和向前前瞻进行正则表达式替换:


  • 向后:
    (?根据注释,不要使用文本操作。使用LINQ to XML非常容易:

    var doc = XDocument.Parse(xml);
    
    foreach (var move in doc.Descendants("Move"))
    {
        if ((string) move.Element("Name") == "Steamroller")
        {
            var damage = move.Element("Damage");
            if (damage != null)
            {
                damage.Value = "2d8";
            }
        }
    }
    
    查看工作演示。

    给你

    如注释中所述,您希望将xmlString解析为实际的XML对象,以便轻松访问元素。这使用XDocument,因此您需要使用System.XML.Linq;
    添加到文件顶部

    private void XMltest()
    {
        string filePath = @"path to your xml";
        string[] myMovesArray = new string[2] {"Steamroller|2d8", "String Shot|4d10"};
    
        // Add a root to your xml since it wasn't shown in your example
        // NOTE: Remove these next two lines if your xml string does indeed have a root. 
        string xmlFragments = File.ReadAllText(filePath);
        string rootedXML = "<root>" + xmlFragments + "</root>";
    
        // load the xml
        XDocument xmlMoves = XDocument.Parse(rootedXML);
    
        // Loop through array and update associated element in xml with the new damage values
        foreach (var move in myMovesArray)
        {
            string moveName = move.Split('|')[0];
            string moveDamage = move.Split('|')[1];
    
            // Loop through xml and find the correct element by name
            foreach (XElement xmlMove in xmlMoves.Descendants("Move"))
            {
                if (xmlMove.Element("Name").Value == moveName)
                {
                    xmlMove.Element("Damage").Value = moveDamage;
                }
            }
        }
    
        // Save back to xml file.
        xmlMoves.Save(filePath);
    }
    
    private void XMltest()
    {
    字符串filePath=@“xml的路径”;
    字符串[]myMovesArray=新字符串[2]{“蒸汽压路机| 2d8”,“字符串快照| 4d10”};
    //将根添加到xml中,因为示例中没有显示它
    //注意:如果xml字符串确实有根,请删除下面两行。
    字符串xmlFragments=File.ReadAllText(文件路径);
    字符串rootedXML=”“+xmlFragments+”;
    //加载xml
    XDocument xmlMoves=XDocument.Parse(rootedXML);
    //循环遍历数组并用新的损坏值更新xml中的关联元素
    foreach(myMovesArray中的var move)
    {
    字符串moveName=move.Split(“|”)[0];
    string moveDamage=move.Split(“|”)[1];
    //循环遍历xml并按名称查找正确的元素
    foreach(xmlMoves.substands(“Move”)中的XElement xmlMove)
    {
    if(xmlMove.Element(“Name”).Value==moveName)
    {
    xmlMove.Element(“损坏”)。值=移动损坏;
    }
    }
    }
    //保存回xml文件。
    保存(文件路径);
    }
    
    您不必为此使用字符串操作-您可以使用Linq-to-Xml轻松访问
    元素。不要将Xml文件视为文本文件。使用Xml读取器之一并将其作为Xml进行操作。联机示例很多。尽管OP要求进行字符串操作…但基于Xml的方法将是逻辑和c这是一个正确的解决方案。如果他们只是想替换字符串,而不需要对XML做任何其他事情,那么解析任何东西似乎都太过分了。我只需要做一次,我确实需要更新一个文本文件一次,用于另一个程序,我认为编辑它基于文本要比花费大量时间更容易ime也在学习如何使用XML