RegEx 在 JavaScript 中工作,但在 C# 中不工作
Posted
技术标签:
【中文标题】RegEx 在 JavaScript 中工作,但在 C# 中不工作【英文标题】:RegEx working in JavaScript but not in C# 【发布时间】: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 版本中留下了仅用于字符串插值的 $ 符号 【参考方案1】:JavaScript 和 C# 正则表达式引擎是不同的。此外,每种语言都有自己的正则表达式模式执行器,因此正则表达式依赖于语言。情况并非如此,如果它适用于一种语言,那么它也适用于另一种语言。
C# 支持命名组,而 JavaScript 不支持它们。
所以你可以找到这两种语言正则表达式之间的多重差异。
【讨论】:
实现之间存在差异是绝对正确的,但在这种特定情况下甚至在此之前就存在问题,因为正则表达式模式尚未从 JS 正确“翻译”为 C# 字符串 【参考方案2】:您将正则表达式模式从 JavaScript 字符串转换为 C# 字符串的方式存在问题。
您在 c# 版本中有额外的空格,并且您还留下了 $ 符号和大括号 ,它们是 JavaScript 版本中字符串插值语法的一部分(它们不是实际正则表达式模式的一部分)。
你有:
"(?![^\\n] 1,$" + width + "$)([^\\n]1,$" + width + ")\\s"
当我相信你想要的是:
"(?![^\\n]1," + width + "$)([^\\n]1," + width + ")\\s"
【讨论】:
@SunnyPatel 我以前在手机上,所以不可能 :) 我现在添加了一些显示差异的东西 做到了!感谢您的帮助! 注意[^\\n]
= .
以上是关于RegEx 在 JavaScript 中工作,但在 C# 中不工作的主要内容,如果未能解决你的问题,请参考以下文章
Rest API不通过android触发JavaScript但在浏览器中工作
Paypal 结帐 - 订单捕获从服务器获得 PERMISSION-DENIED 但在 javascript 客户端中工作
如何让这个 Javascript 字谜算法在 Ruby 中工作?
整数文字 '115000159351' 在存储到 'Int' 时溢出,但在一个项目中工作正常,但在另一个项目中工作正常 - Swift