C#用模式替换捕获的字符串?

时间:2018-04-12 22:15:56

标签: c# regex replace pattern-matching

你可以看到代码是找到一个值并替换它但我希望能够从同一个文件中找到5个其他类似的模式,这与构建ini文件的方式有点复杂。任何形式的“领导”或帮助都会有所帮助。

到目前为止我设法做的是改变最后 DeadZone = 0.1 第一个,但我希望它覆盖当我选择输入值时,所有这些 6

/初级

这是 TAInput.ini

[TAGame.PlayerInput_TA]
MouseSensitivity=10
TapTime=0.5
DoubleTapTime=0.25
GamepadDeadzone=0.1 // <-- Should not be captured either but haven't been so far.
GamepadLookScale=20
KeyboardAxisBlendTime=0
GamepadDeadzones=( Type=IPT_360, Key=XboxTypeS_RightTriggerAxis, DeadZone=0.1 )
GamepadDeadzones=( Type=IPT_360, Key=XboxTypeS_LeftTriggerAxis, DeadZone=0.1 )
GamepadDeadzones=( Type=IPT_PS4, Key=XboxTypeS_RightTriggerAxis, DeadZone=0.1 )
GamepadDeadzones=( Type=IPT_PS4, Key=XboxTypeS_LeftTriggerAxis, DeadZone=0.1 )
GamepadDeadzones=( Type=IPT_XBOX_ONE, Key=XboxTypeS_RightTriggerAxis, DeadZone=0.1 )
GamepadDeadzones=( Type=IPT_XBOX_ONE, Key=XboxTypeS_LeftTriggerAxis, DeadZone=0.1 )

[ProjectX.ControlPreset_X]

这是 Form1.cs

       try
        {

            const string FILENAME = "TAInput.ini";
            string text = File.ReadAllText(FILENAME);
            const string DEADZONE = @"DeadZone=0.(?<Ratio>[\d\.]+)";

            Match match = Regex.Match(text, DEADZONE, RegexOptions.Multiline);

            if (match.Success)
            {
                int index = match.Groups["Ratio"].Index;
                int length = match.Groups["Ratio"].Length;

                text = text.Remove(index, length);
                text = text.Insert(index, nudInput.Value.ToString() + "" + "\n");


                File.WriteAllText(FILENAME, text);
                Process.Start(FILENAME);
            }
        }
        catch
        {
            MessageBox.Show("No");
        }

1 个答案:

答案 0 :(得分:0)

您需要在需要修改文本时使用Regex.Replace。您正在删除匹配时找到的文本,然后插入nudInput.Value.ToString() + "\n" - 这等于只是将匹配替换为其他数字。但是,您必须匹配并捕获您需要保留的内容,并且只需匹配您需要删除的内容。这意味着,您不需要命名捕获。

使用

try
{
    const string FILENAME = "TAInput.ini";
    string text = File.ReadAllText(FILENAME);
    const string DEADZONE = @"(DeadZone=0\.)\d[\d.]*";
    var result = Regex.Replace(text, DEADZONE, $"$1{nudInput.Value.ToString()}\n");
    File.WriteAllText(FILENAME, text);
    Process.Start(FILENAME);
}
catch
{
     MessageBox.Show("No");
}

下面,

  • (DeadZone=0\.) - 捕获第1组(稍后使用$1引用):匹配并捕获DeadZone=0.文字子字符串
  • \d[\d.]* - 匹配一个数字,然后匹配0+个数字和/或点。

如果你仍坚持自己的做法,那就太过于苛刻和脆弱。关键是您需要匹配与您替换的数字不同的数字,并且需要在每次后续替换之前检查整个字符串是否匹配:

    try
    {
        const string FILENAME = "TAInput.ini";
        string text = File.ReadAllText(FILENAME);

        Regex DEADZONE = new Regex($@"DeadZone=0\.(?!{nudInput.Value.ToString()}\b)(?<Ratio>\d[\d.]*)");
        int pos = 0;
        while (DEADZONE.IsMatch(text, pos)) 
        {
            Match match = DEADZONE.Match(text);
            int index = match.Groups["Ratio"].Index;
            int length = match.Groups["Ratio"].Length;
            pos = index+nudInput.Value.ToString().Length+1;
            text = text.Remove(index, length);
            text = text.Insert(index, $"{nudInput.Value.ToString()}\n");
        }
        File.WriteAllText(FILENAME, text);
        Process.Start(FILENAME);
    }
    catch
    {
        MessageBox.Show("No");
    }

请参阅C# demo