【发布时间】:2019-10-25 03:46:15
【问题描述】:
我目前在 Javascript 中有一个使用 RegEx 的 WordWrap 函数。我传递了我想要包装的字符串和我想要开始包装文本的长度,该函数返回一个新字符串,在字符串的适当位置插入换行符,如下所示:
wordWrap(string, width) {
let newString = string.replace(
new RegExp(`(?![^\\n]{1,${width}}$)([^\\n]{1,${width}})\\s`, 'g'), '$1\n'
);
return newString;
}
出于一致性的目的,我不会深入探讨,我需要在 C# 中使用相同或相似的 RegEx,但我无法成功复制该函数。我已经经历了很多次迭代,但这是我目前拥有的:
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;
}
无论我传递的字符串和长度如何,这都不可避免地最终找不到匹配项。我读过 JavaScript 中使用的 RegEx 与 .NET 中的标准 RegEx 功能不同。我查看了PCRE.NET,但也没有运气。
我是否正朝着正确的大方向前进?谁能帮我将 JavaScript 中的第一个代码块转换为 C# 中适度接近的代码块?
编辑:对于那些希望更清楚地了解工作函数的作用以及我正在寻找 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"
希望能稍微澄清一下。
【问题讨论】:
-
我马上注意到的是,在 C# 版本中,“1”之前有额外的空格。另外,您在 JS 版本中留下了仅用于字符串插值的 $ 符号
标签: javascript c# .net regex pcre