В настоящее время у меня есть рабочая функция 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"
Надеюсь, это немного прояснит ситуацию.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Механизмы регулярных выражений JavaScript и C# отличаются. Также у каждого языка есть свой собственный исполнитель шаблонов регулярных выражений, поэтому Regex зависит от языка. Это не тот случай, если это работает для одного языка, значит, оно будет работать и для другого.
C# поддерживает именованные группы, а JavaScript их не поддерживает.
Таким образом, вы можете найти множество различий между этими двумя языками регулярных выражений.
Это абсолютно верно, что между реализациями есть различия, но в этом конкретном случае есть проблемы еще до этого, поскольку шаблон регулярного выражения не был правильно «переведен» из строки JS в строку C#.
Существуют проблемы со способом перевода шаблона регулярного выражения из строки JavaScript в строку C#.
У вас есть лишние пробелы в версии C#, а также вы оставили символы $ и фигурные скобки {, которые являются частью синтаксиса интерполяции строк в версии JavaScript (они не являются частью фактического шаблона регулярного выражения).
У тебя есть:
"(?![^\\n]{ 1,${" + width + "}}$)([^\\n]{1,${" + width + "}})\\s"
когда я считаю, что вы хотите:
"(?![^\\n]{1," + width + "}$)([^\\n]{1," + width + "})\\s"
@SunnyPatel Раньше я был на мобильном телефоне, так что это было бы невозможно :) Теперь я добавил кое-что, что показывает разницу
Это сделало это! Спасибо за помощь!
Примечание [^\\n] = .
Что-то, что я сразу замечаю, это то, что у вас есть дополнительные пробелы в версии C# перед «1». Кроме того, вы оставили символы $, которые используются только для интерполяции строк в версии JS.