正则表达式 - 这可能吗?

时间:2011-08-31 18:18:38

标签: c# .net regex

不是描述我想要的东西(很难解释),让我提供一个使用正则表达式在C#中完成的示例:

"HelloWorld" should be transformed to "Hello World" 
"HelloWORld" should be transformed to "Hello WO Rld" //Two consecutive letters in capital should be treatead as one word
"helloworld" should be transformed to "helloworld"

编辑

"HellOWORLd" should be transformed to "Hell OW OR Ld"

每2连续的大写字母应被视为一个单词。

这可能吗?

6 个答案:

答案 0 :(得分:7)

这是完全有效的C#代码,而不仅仅是正则表达式:

Console.WriteLine(
    Regex.Replace(
        "HelloWORld", 
        "(?<!^)(?<wordstart>[A-Z]{1,2})", 
        " ${wordstart}", RegexOptions.Compiled));

它打印出来:

Hello WO Rld

<强>更新

为了使这更加符合UNICODE /国际,请考虑将[A-Z]替换为\p{Lt}表示代表大写字母的UNICODE代码点)。当前输入的结果是相同的。所以这是一个更引人注目的例子:

Console.WriteLine(Regex.Replace(
            @"ÉclaireürfØÑJßå",
            @"(?<!^)(?<wordstart>\p{Lu}{1,2})", 
            @" ${wordstart}",
            RegexOptions.Compiled));

答案 1 :(得分:2)

正则表达式引擎本质上不是变形的东西,而是模式匹配(和替换)引擎。人们常常误认为正则表达式的替换部分,认为它可以做的比它设计的更多。

回到你的问题,但是...正则表达式不能做你想要的,相反,你应该编写自己的解析器来做到这一点。使用C#,如果您熟悉该语言,则此任务有点微不足道。

这是“您正在使用错误的工具进行工作”的案例。

答案 2 :(得分:1)

string f(string input)
{ 
  //'lowerUPPER' -> 'lower UPPER'
  var x = Regex.Replace(input, "([a-z])([A-Z])","$1 $2"); 

  //'UPPER' -> 'UP PE R'
  return Regex.Replace(x, "([A-Z]{2})","$1 "); 
}

答案 3 :(得分:1)

以下是检测您要查找内容的正则表达式:

([A-Z]\w*?)[A-Z]

这匹配从A到Z的任何大写字母,然后是aphanumerics,直到下一个大写。

([A-Z]{2}\w*?)[A-Z]

这恰好匹配A到Z的任何大写字母2次。

Regex是一个匹配引擎,你可以解析输入字符串并使用regex.isMatch来查找候选匹配,然后在输出字符串中插入空格

答案 4 :(得分:0)

class Program
{
    static void Main(string[] args)
    {
        Print(Parse("HelloWorld"));
        Print(Parse("HelloWORld"));
        Print(Parse("helloworld"));
        Print(Parse("HellOWORLd"));
        Console.ReadLine();
    }

    static void Print(IEnumerable<string> input)
    {
        foreach (var s in input)
        {
            Console.Write(s);
            Console.Write(' ');
        }
        Console.WriteLine();
    }

    static IEnumerable<string> Parse(string input)
    {
        var sb = new StringBuilder();
        for (int i = 0; i < input.Length; i++)
        {
            if (!char.IsUpper(input[i]))
            {
                sb.Append(input[i]);
                continue;
            }
            if (sb.Length > 0)
            {
                yield return sb.ToString();
                sb.Clear();
            }
            sb.Append(input[i]);
            if (char.IsUpper(input[i + 1]))
            {
                sb.Append(input[++i]);
                yield return sb.ToString();
                sb.Clear();
            }
        }
        if (sb.Length > 0)
        {
            yield return sb.ToString();
        }
    }
}

答案 5 :(得分:0)

我认为在这种情况下不需要正则表达式。 试试这个:

  static void Main(string[] args)
        {
            var input = "HellOWORLd";
            var i = 0;
            var x = 4;
            var len = input.Length;
            var output = new List<string>();
            while (x <= len)
            {
                output.Add(SubStr(input, i, x));
                i = x;
                x += 2;

            }
            var ret = output.ToArray(); //["Hell","OW", "OR", "Ld"]

            Console.ReadLine();


        }

static string SubStr(string str, int start, int end)
            {
                var len = str.Length;
                if (start >= 0 && end <= len)
                {
                    var ret = new StringBuilder();
                    for (int i = 0; i < len; i++)
                    {
                        if (i == start)
                        {
                            do
                            {
                                ret.Append(str[i]);
                                i++;
                            } while (i != end);
                        }
                    }
                    return ret.ToString();
                }
                return null;
            }