使用 regex.replace() 添加到字符串中倒数第三个逗号", and "



我的代码中有两个场景:

  1. 仅由名称和最后一项组成的字符串没有名称(",CPA,CFA"(。例如,"约翰,简,乔,并且我使用下面的代码将最后一个逗号替换为;约翰、简和乔">
  2. 一个字符串,由名称和末尾的CPA/CFA名称(",CPA,CFA"(组成,如";John,Jan,Joe,注册会计师,CFA。在这种情况下,我需要将第三个到最后的commma替换为;John,Jan和Joe,注册会计师,CFA"。我只需要处理从第三个逗号到最后一个逗号的情况我会注意到,这些只是示例字符串,实际上它可能包括更多的名称(即,它可以是"jake,jan,joe,john,jessie"(,但最终我只是检查姓氏是否有名称(额外的逗号(,如果有,它应该只添加和来替换倒数第三个逗号

我的目标是将和正确地添加到逗号分隔列表中的最后一项中,以遵循标准的英语做法。最后一个项目的指定逗号丢弃了我用来添加最后一个并替换逗号的Regex表达式。

我的代码:

if(str1.EndsWith(", CPA, CFA"))
{
//need to figure out
}
else
{
Regex.Replace(str1, ", ([^,]+)$", " and $1");
}

您可以使用一个模式,其中有两个捕获组捕获第一个逗号并匹配第二个逗号

更换使用两组$1 and $2

([^s,]+),s*([^s,]+(?:, CPA, CFA)?)$

模式匹配:

  • ([^s,]+)捕获组1,匹配1+个非空白字符和逗号

  • ,s*匹配逗号和可选空白字符

  • (捕获第2组

    • [^s,]+匹配除空白字符或逗号之外的1+个字符
    • (?:, CPA, CFA)?可选匹配, CPA, CFA
  • )关闭第2组

  • $字符串结束

Regex演示|C#演示

示例

string pattern = @"([^s,]+),s*([^s,]+(?:, CPA, CFA)?)$";
string input = "John, Jan, JoenJohn, Jan, Joe, CPA, CFAnjake, jan, joe, john, jessie, jack, jones";
Console.WriteLine(Regex.Replace(input, pattern, @"$1 and $2", RegexOptions.Multiline));

输出

John, Jan and Joe
John, Jan and Joe, CPA, CFA
jake, jan, joe, john, jessie, jack and jones

您可以在不使用Regex的情况下使用以下代码

//string input = "John, Jan, Joe, CPA, CFA";
string input = "John, Jan, Joe";
var result = input.Select((b, i) => b.Equals(',') ? i : -1).Where(i => i != -1).ToList();
if(input.EndsWith(", CFA"))
input=input.Replace(input.Substring(0,result[result.Count()-3] +2), input.Substring(0, result[result.Count()-3]+2) + "and ");
else
input = input.Replace(input.Substring(0, result[result.Count()-1] +1), input.Substring(0, result[result.Count()-1]) + " and ");
Console.WriteLine(input); 

如果string input = "John, Jan, Joe, CPA, CFA":

结果:"John,Jan和Joe,注册会计师,CFA";(显然,您添加了一个额外的逗号(

如果string input = "John, Jan, Joe"

结果:John,Jan和Joe

最新更新