大写并添加句点登录首字母(使用Regex Replace)



我想在首字母中添加句点,并确保所有字母都是大写的。然而,如果已经给出了句号,那么就不要添加句号。

想要的结果:
abc=>A.B.C
Abc=>A.B.C
A.B.C=>A.B.C
Ab.C=>A.B.C
ABC=>A.B.C
A.B.C=>A.B.C
A.B.C=>A.B.C

我认为regex-replace将适用于此。到目前为止,我只能想出以下代码:

Regex.Replace(initials, @"w{1}", m => m +".").ToUpper();

这只适用于字符串中没有句点的情况,否则,它只会在一行中添加两个句点(即a.b.c=>a..b.c.(

如果更推荐regex-replace以外的其他方法,我热烈欢迎它们。我在c#中工作,但希望这个问题对其他语言也通用。

我建议

p{L}.*

模式,或(c#代码(:

initials = Regex.Replace(
initials, 
@"p{L}.*", 
m => $"{m.Value.Trim('.').ToUpper()}.");

解释的模式

p{L}  - unicode letter
.*    - zero or more dots ('.')

演示:

string[] tests = new string[] {
"abc",
"Abc",
"A.b.c",
"Ab.C",
"ABC",
"A.B.C",
"A.B.C.",
};
string report = string.Join(Environment.NewLine, tests
.Select(test => $"{test,7} => {Regex.Replace(test, @"p{L}.*", m => $"{m.Value.Trim('.').ToUpper()}.")}"));
Console.Write(report);

结果:

abc => A.B.C.
Abc => A.B.C.
A.b.c => A.B.C.
Ab.C => A.B.C.
ABC => A.B.C.
A.B.C => A.B.C.
A.B.C. => A.B.C.

我对c#了解不多,但拼凑了以下内容:

using System;
using System.Collections;
using System.Text.RegularExpressions;
class Program
{
static void Main() {
var txt = "Ab.C";
var new_txt = Regex.Replace(txt, @"(w).?", @"$1.").ToUpper();
Console.Write(new_txt);
}
}

模式(w).?表示:

  • (w)-一个单词字符的捕获组
  • .?-后面跟着一个可选的点

请注意,w可以在c#中捕获更多,而不仅仅是[A-Za-z0-9_]。请参阅此处的文档。这意味着您可能希望使用字符类更加具体。

您也可以使用捕获集合,使用重复捕获组将一个字符后面跟着一个可选的点重复n次。

(?:(w).?){3,}

请参阅.NET正则表达式演示。

例如:

string[] strings = {
"abc",
"Abc",
"Ab.C",
"ABC",
"A.B.C",
"A.B.C."
};
foreach (String s in strings)
{
Console.WriteLine(Regex.Replace(
s,
@"(?:(w).?){3,}", 
m => string.Join("", m.Groups[1].Captures.Select(x => x + ".")).ToUpper())
);
}    

输出

A.B.C.
A.B.C.
A.B.C.
A.B.C.
A.B.C.
A.B.C.

无RegEx 的方法

string result = string.Concat(input.Where(IsLetter).Select(x => char.ToUpper(x) + "."));

https://dotnetfiddle.net/macBWv

最新更新