Как преобразовать верхний индекс в обычный текст в строке C# - PullRequest
2 голосов
/ 17 апреля 2020

У меня есть строки с математическими выражениями, такими как 2⁻¹² + 3³ / 4⁽³⁻¹⁾.

Я хочу преобразовать эти строки в форму 2^-12 + 3^3 / 4^(3-1).

Что я получил так далеко, что я могу извлечь номер надстрочного знака и добавьте ^ .

Скрипт кода ниже: https://dotnetfiddle.net/1G9ewP

using System;
using System.Text.RegularExpressions;

public class Program
{
    private static string ConvertSuperscriptToText(Match m){
        string res = m.Groups[1].Value;

        res = "^" + res;
        return res;
    }
    public static void Main()
    {
        string expression = "2⁻¹² + 3³ / 4⁽³⁻¹⁾";
        string desiredResult = "2^-12 + 3^3 / 4^(3-1)";

        string supChars = "([¹²³⁴⁵⁶⁷⁸⁹⁰⁺⁻⁽⁾]+)";
        string result = Regex.Replace(expression, supChars, ConvertSuperscriptToText);

        Console.WriteLine(result); // Currently prints 2^⁻¹² + 3^³ / 4^⁽³⁻¹⁾
        Console.WriteLine(result == desiredResult); // Currently prints false
    }
}

Как мне заменить символы надстрочного индекса без замены каждого из них по одному?

Если мне нужно заменить их одного за другим, как я могу заменить их чем-то вроде коллекции, подобной str_replace PHP, которая принимает массивы в качестве поиска и заменить аргумент?

Бонусный вопрос, как я могу заменить все виды символов надстрочного текста на обычный текст и обратно надстрочный?

1 Ответ

2 голосов
/ 17 апреля 2020

Вам просто нужен словарь для сопоставления значений, а затем вы можете использовать Linq для их перевода и создания новой строки из них.

private static Dictionary<char, char> scriptMapping = new Dictionary<char, char>()
{
    ['¹'] = '1',
    ['²'] = '2',
    ['³'] = '3',
    ['⁴'] = '4',
    ['⁵'] = '5',
    ['⁶'] = '6',
    ['⁷'] = '7',
    ['⁸'] = '8',
    ['⁹'] = '9',
    ['⁰'] = '0',
    ['⁺'] = '+',
    ['⁻'] = '-',
    ['⁽'] = '(',
    ['⁾'] = ')',
};

private static string ConvertSuperscriptToText(Match m){
    string res = m.Groups[1].Value;

    res = "^" + new string(res.Select(c => scriptMapping[c]).ToArray());
    return res;
}

Вы также можете создать свое регулярное выражение из словаря, чтобы есть только одно место для добавления новых подписчиков.

string supChars = "([" + new string(scriptMapping.Keys.ToArray()) + "]+)"
...