Я использую Regex для замены всех строк в шаблоне. Все работает нормально, пока не появится значение, которое я хочу заменить, а именно $0.00. Кажется, я не могу правильно заменить $0 в качестве замещающего текста. Я получаю "Project Cost: [[ProjectCost]].00". Есть идеи, почему?

Вот пример кода с некоторыми упрощенными переменными.

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;

using System.Security;
using System.Text.RegularExpressions;


namespace Export.Services
{
    public class CommonExportService
    {

        private Dictionary<string, string> _formTokens;


        public CommonExportService() {
         _formTokens =     {{"EstimatedOneTimeProjectCost", "0.00"}};
        }


        private string GetReplacementText(string replacementText)
        {
            replacementText = "Project Cost: [[EstimatedOneTimeProjectCost]]";
            //replacement text = "Project Cost: [[ProjectCost]]"
            foreach (var token in _formTokens)
            {
                var val = token.Value;
                var key = token.Key;

                //work around for now
                //if (val.Equals("$0.00")) {
                //    val = "0.00";
                //}

                var reg = new Regex(Regex.Escape("[[" + key + "]]"));


                if (reg.IsMatch(replacementText))                        
                    replacementText = reg.Replace(replacementText, SecurityElement.Escape(val ?? string.Empty));
                else {

                }
            }

            return replacementText;

            //$0.00 does not replace,  something is happening with the $0 before the decimal  
            //the output becomes Project Cost: [[EstimatedOneTimeProjectCost]].00


            //The output is correct for these
            //0.00 replaces correctly
            //$.00 replaces correctly
            //0 replaces correctly
            //00 replaces correctly
            //$ replaces correctly

        }
    }
}
3
Train 15 Окт 2018 в 00:55

1 ответ

Лучший ответ

Поскольку ваша строка замены создается динамически, вам нужно позаботиться о символе $ в ней. Когда за $ следует 0, $0 является обратной ссылкой на все совпадение, поэтому все совпадение вставляется в результате замены.

Вам просто нужно экранировать доллар $ внутри шаблона буквальной строки:

return replacementText.replace("$", "$$");

Тогда ваш шаблон замены будет содержать $$0, и это будет "переводиться" в буквальную строку $0.

4
Wiktor Stribiżew 14 Окт 2018 в 22:08