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

时间:2010-11-18 06:22:24

标签: c# java .net regex

我正在尝试将以下代码从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;}"

但如果我将正则表达式模式更改为: -

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

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

现在在你继续说这是一个REGEX问题,而不是Java到C#转换,问题我想假设正则表达式是有效的,因为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 个答案:

答案 0 :(得分:2)

目前你的正则表达式存在两个问题:

  • 您没有关闭括号(或者您在编辑问题之前没有关闭)
  • 您正在搜索以“: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(;|})"

答案 1 :(得分:1)

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);
    }
} 

这可以解决您的问题。