【问题标题】:RegEx working in JavaScript but not in C#RegEx 在 JavaScript 中工作,但在 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 版本中留下了仅用于字符串插值的 $ 符号

标签: javascript c# .net regex pcre


【解决方案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] = .
猜你喜欢
  • 2019-11-19
  • 1970-01-01
  • 1970-01-01
  • 2016-04-18
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
相关资源
最近更新 更多