不是描述我想要的东西(很难解释),让我提供一个使用正则表达式在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连续的大写字母应被视为一个单词。
这可能吗?
答案 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;
}