RegEx работает в JavaScript, но не в C # - PullRequest
0 голосов
/ 10 июня 2019

В настоящее время у меня есть рабочая функция 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 во что-то умеренно близкое в C #?

edit: Для тех, кто ищет больше ясности в том, что делает рабочая функция и что я ищу для функции C #: я хочу вывести строку, в которую вставлена ​​новая строка (\ 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"

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

Ответы [ 2 ]

2 голосов
/ 10 июня 2019

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

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

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

1 голос
/ 10 июня 2019

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

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

У вас есть:

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

, когда вы хотите получить:

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