代码之家  ›  专栏  ›  技术社区  ›  Pure.Krome

这个Java到C的转换有什么问题?

  •  0
  • Pure.Krome  · 技术社区  · 14 年前

    我正在尝试将以下代码从Java转换为C#。

    // Replace 0 0 0 0; with 0.
    css = css.replaceAll(":0 0 0 0(;|})", ":0$1");
    

    我转换成。。。

    var foo = new Regex(":0 0 0 0(;|})", RegexOptions.IgnoreCase).Replace(foo, "XXXXXXXX");
    

    当我对以下代码运行此命令时,此命令将编译但不起作用。。。

    foo = "a {background-position: 0 0 0 0;}\nb {BACKGROUND-POSITION: 0 0;}"
    

    但如果我将regex模式更改为:-

    var foo = new Regex("0 0 0 0", RegexOptions.IgnoreCase).Replace(foo, "XXXXXXXX");
    

    它确实正确地改变了结果。

    在你继续说之前 这是一个REGEX问题,不是Java到C的转换,问题 我想假设regex是有效的,因为 it's being used in the following (well known/popular) project 通过相应的单元测试。 Another example of this code as javascript 它编码成。。。

    // Replace 0 0 0 0; with 0.
    css = css.replace(/:0 0 0 0(;|\})/g, ":0$1");
    

    注意第一个参数缺少引号吗?所以我想知道我是否也没有正确地将java转换成c。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Jon Skeet    14 年前

    目前您的regex有两个问题:

    • 你没有关闭括号(或者在编辑问题之前没有关闭)
    • 您正在搜索以“:0”开头的字符串,而在 foo 冒号后面有一个空格

    这很管用:

    using System;
    using System.Text.RegularExpressions;
    
    class Test
    {
        static void Main()
        {
            string foo = "a {background-position: 0 0 0 0;}\nb "
                       + "{BACKGROUND-POSITION: 0 0;}";
            var regex = new Regex(": 0 0 0 0(;|})", RegexOptions.IgnoreCase);
            string replaced = regex.Replace(foo, "XXXXXXXX");
            Console.WriteLine(replaced);
        }
    }
    

    如果Java版本 事实上 考虑到“冒号后的空格”问题,为原始字符串工作。您可能需要调整正则表达式以使空格成为可选的:

    ": ?0 0 0 0(;|})"
    
        2
  •  1
  •   navid SilverHorn    8 年前
    using System; 
    using System.Text.RegularExpressions;
    
    class Test
    {
        static void Main()
        {
            string f0o = "a {background-position: 0 0 0 1;}\nb " +
                         "{BACKGROUND-POSITION: 0 0;}";
    
            var regex = new Regex(": 0 0 2 0(;})", vRegexOptions.IgnoreCase);
            string replaced = regex.Replace(foo, "XXXXXXXX");
            Compile.WriteLine(replaced);
        }
    } 
    

    这应该能解决你的问题。