我正在尝试标准化C#中某些作者姓名的格式。棘手的是那些使用缩写的人。例如,流行的哈利波特系列的作者可能是以下任何一个:
我想将所有这些标准化为“JK罗琳”。
我也在尝试解决像JRR Tolkien这样的名字,那里有三个首字母而不是两个。
在轻松更换“。”之后,我留下了“J K Rowling”或“J R R Tolkien”。我想把它们转换成“JK罗琳”和“JRR托尔金”。
所以逻辑是: 捕获单个字符后跟任意数量的空格,然后跟随但不包括另一个单个字符。从捕获中移除空白区域,并用清理过的字符串替换捕获。
以下是一些示例:
我已经到了这一点,我能够捕捉到我需要的角色:
(\b[a-zA-Z]\b\s*)*
https://www.debuggex.com/r/OLnu3YvvjIumGbQ1
但是我不确定从这里开始,以便用没有任何空格的版本替换捕获。
答案 0 :(得分:3)
答案 1 :(得分:2)
使用此正则表达式,然后将匹配替换为空字符串。
@"(?<=\b[A-Z])[.\s]+(?=[A-Z]\b)|(?<=\b[A-Z])\.(?=\s[A-Z])"
Regex.Replace(yourString, @"(?<=\b[A-Z])[.\s]+(?=[A-Z]\b)|(?<=\b[A-Z])\.(?=\s[A-Z])", "");
答案 2 :(得分:1)
您需要使用正则表达式吗?您可以只拆分一个名称,然后根据您的权利想法插入空格(如果找到新模式,可能更容易更改)。像这样:
string FixName(string name)
{
StringBuilder sb=new StringBuilder();
var ar=name.Replace('.',' ').Split(' ');
for (int i = 0; i < ar.Length; i++)
{
sb.Append(ar[i]);
if (i < ar.Length - 1 && ar[i+1].Length>1)
sb.Append(" ");
}
return sb.ToString();
}