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 客户端中工作

vuex 商店在开发服务器中工作,但在生产构建中不工作

如何让这个 Javascript 字谜算法在 Ruby 中工作?

整数文字 '115000159351' 在存储到 'Int' 时溢出,但在一个项目中工作正常,但在另一个项目中工作正常 - Swift

jquery 不在部署中工作,但在本地 nuxtjs 中工作?