RegEx работает в JavaScript, но не в С#

В настоящее время у меня есть рабочая функция WordWrap в Javascript, которая использует RegEx. Я передаю строку, которую я хочу обернуть, и длину, с которой я хочу начать перенос текста, и функция возвращает новую строку с новыми строками, вставленными в соответствующие места в строке, как показано ниже:

wordWrap(string, width) {
    let newString = string.replace(
      new RegExp(`(?![^\\n]{1,${width}}$)([^\\n]{1,${width}})\\s`, 'g'), '$1\n'
    );
    return newString;
}

В целях согласованности я не буду вдаваться в подробности, мне нужно использовать идентичный или похожий RegEx в C#, но у меня возникли проблемы с успешной репликацией функции. Я прошел через много итераций этого, но это то, что у меня сейчас есть:

        private static string WordWrap(string str, int width)
    {
        Regex rgx = new Regex("(?![^\\n]{ 1,${" + width + "}}$)([^\\n]{1,${" + width + "}})\\s");
        MatchCollection matches = rgx.Matches(str);

        string newString = string.Empty;

        if (matches.Count > 0)
        {
            foreach (Match match in matches)
            {
                newString += match.Value + "\n";
            }
        }

        else
        {
            newString = "No matches found";
        }

        return newString;
    }

Это неизбежно приводит к тому, что совпадения не находят независимо от строки и длины, которые я передаю. Я читал, что RegEx, используемый в JavaScript, отличается от стандартной функциональности RegEx в .NET. Я просмотрел PCRE.NET, но и с этим мне не повезло.

Я иду в правильном общем направлении с этим? Может ли кто-нибудь помочь мне преобразовать первый блок кода в JavaScript во что-то умеренно близкое к С#?

редактировать: для тех, кто ищет больше ясности в том, что делает рабочая функция, и что я ищу для функции С#: то, что я ищу для вывода, - это строка, в которой есть новая строка (\n), вставленная по ширине, переданной в функция. Одна вещь, которую я забыл упомянуть (но на самом деле не связанная с моей проблемой здесь), заключается в том, что рабочая версия JavaScript находит конец слова, поэтому оно не сокращается. Так, например, эта строка:

"This string is really really long so we want to use the word wrap function to keep it from running off the page.\n"

... будет преобразовано в это с шириной, равной 20:

"This string is really \nreally long so we want \nto use the word wrap \nfunction to keep it \nfrom running off the \npage.\n"

Надеюсь, это немного прояснит ситуацию.

Что-то, что я сразу замечаю, это то, что у вас есть дополнительные пробелы в версии C# перед «1». Кроме того, вы оставили символы $, которые используются только для интерполяции строк в версии JS.

Cocowalla 10.06.2019 20:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
369
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Механизмы регулярных выражений JavaScript и C# отличаются. Также у каждого языка есть свой собственный исполнитель шаблонов регулярных выражений, поэтому Regex зависит от языка. Это не тот случай, если это работает для одного языка, значит, оно будет работать и для другого.

C# поддерживает именованные группы, а JavaScript их не поддерживает.

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

Это абсолютно верно, что между реализациями есть различия, но в этом конкретном случае есть проблемы еще до этого, поскольку шаблон регулярного выражения не был правильно «переведен» из строки JS в строку C#.

Cocowalla 10.06.2019 20:32
Ответ принят как подходящий

Существуют проблемы со способом перевода шаблона регулярного выражения из строки JavaScript в строку C#.

У вас есть лишние пробелы в версии C#, а также вы оставили символы $ и фигурные скобки {, которые являются частью синтаксиса интерполяции строк в версии JavaScript (они не являются частью фактического шаблона регулярного выражения).

У тебя есть:

"(?![^\\n]{ 1,${" + width + "}}$)([^\\n]{1,${" + width + "}})\\s"

когда я считаю, что вы хотите:

"(?![^\\n]{1," + width + "}$)([^\\n]{1," + width + "})\\s"

@SunnyPatel Раньше я был на мобильном телефоне, так что это было бы невозможно :) Теперь я добавил кое-что, что показывает разницу

Cocowalla 10.06.2019 20:30

Это сделало это! Спасибо за помощь!

anon878787 10.06.2019 20:46

Примечание [^\\n] = .

Wiktor Stribiżew 10.06.2019 22:09

Другие вопросы по теме