正则表达式将国籍与文本分开

时间:2018-05-22 05:11:17

标签: c# regex

我有人民国籍列表反对他们的参赛作品,大多数参赛作品都是正确的,但有些参赛作品如下: 正确的就像下面一样;

German
Iranian
Qatar

不正确就像下面一样;

  

可能埃塞俄比亚

  • (国籍前的文字)
  

黎巴嫩公民身份

  • (国籍后的文字)
  

DRC 比利时国籍

  • (国籍加入和)
  

(1)德国(b)阿尔及利亚

  • (以1和b为分隔符)
  

(a)俄语(b)格鲁吉亚

  • (使用a和b分隔符)
  

a)法语,b)突尼斯

  • (使用和,和b分隔符)
  

印度尼西亚(截至2003年12月)

  • (国籍后的其他文字)
  

伊朗(伊朗公民身份)

  • (国籍后的另一个文字)
  出生时

苏丹人

  • (国籍后的另一个文字)
  

(1)俄语(2)苏联(直到1991年)

  • (第二次参赛后的文字)
  

巴林(2015年1月撤销公民身份)

  • (不同的文字)
  

美利坚合众国。也被认为拥有叙利亚国籍

  • (包含国籍的描述性文字)
  

突尼斯(双重国籍)

  • (不同的文字)
  

(1)德语(2)摩洛哥

  • (1和2带()双括号)
  

1)沙特阿拉伯 2)卡塔尔

  • (1和2)括号)
  

a)中非共和国 b)南苏丹

  • (单括号)
  

伊朗国家和美国国家/公民

  • (文字内的国籍,加入和)
  

科威特公民身份于2002年撤销

  • (另有文字)

我只需要从给定的文本中删除粗体文本(国籍)。国籍可以是任何国家,这些只是一些国家的样本。

我如何应用正则表达式或任何类型条件,以达到预期的效果。 我试图检查文本是否包含这些字符然后拆分它们。为此我需要创建更多的20个条件,这也不是很好的方法。

List<string> listOfNationalities = listOfNationalities;

List<string> multiple new List<string>();
foreach (var nationality in listOfNationalities)
{
    if(nationality.Contains("(1)"))
    {
        string[] nat = nationality.Split(')'); 
        foreach (var item in nat)
        {
            multiple.Add(item);
        }
    }
}

2 个答案:

答案 0 :(得分:2)

如果国籍是由固定的可用选项列表提供的。 您可以执行以下操作:

List<string> listOfNationalities = listOfNationalities;

List<string> validNationalities = new List<string>();
validNationalities.Add("Brazilian");
validNationalities.Add("Japanese");
validNationalities.Add("...");

List<string> multiple = listOfNationalities.Where(n => validNationalities.Contains(n));

甚至更简单:

string listOfNationalities = string.Join("|",listOfNationalities);

List<string> validNationalities = new List<string>();
validNationalities.Add("Brazilian");
validNationalities.Add("Japanese");
validNationalities.Add("...");

List<string> multiple = validNationalities.Where(n => listOfNationalities.Contains(n));

通过这种方式,您将获得两个国籍。

答案 1 :(得分:0)

如果您已有一个有效国籍列表,并且如果国籍不包含特殊字符,您可以使用以下内容在运行时创建正则表达式模式:

public string NationalitiesPattern;

public string GetNationalitiesPattern()
{
    List<string> listOfNationalities = // All valid nationalities.
    string joinedNationalities = string.Join("|", listOfNationalities);
    return $@"\b(?:{joinedNationalities})\b";       // "\b(?:German|Iranian|Qatar|etc)\b"
}

然后你可以像这样使用它:

if (string.IsNullOrEmpty(NationalitiesPattern))
    NationalitiesPattern = GetNationalitiesPattern();

MatchCollection matches = Regex.Matches(inputString, NationalitiesPattern);
foreach (Match m in matches)
    Console.WriteLine(m.Value);