C# Regex将国籍与文本分开

C# Regex将国籍与文本分开,c#,regex,C#,Regex,我有一份关于参赛者国籍的清单,大部分参赛者都给出了正确的答案,但有些参赛者的答案如下:; 正确的如下所示 German Iranian Qatar 不适当的情况如下 German Iranian Qatar 可能是埃塞俄比亚人 (国籍前的案文) 黎巴嫩公民身份 (国籍后案文) 刚果和比利时国籍 (国籍加入和) (1) 德国(b)阿尔及利亚 (以1和b作为分隔符) (a) 俄语(b)格鲁吉亚 (带a和b分离器) a) 法语,b)突尼斯语 (带a和b分离器) 印度尼西亚语

我有一份关于参赛者国籍的清单,大部分参赛者都给出了正确的答案,但有些参赛者的答案如下:; 正确的如下所示

German
Iranian
Qatar
不适当的情况如下

German
Iranian
Qatar
可能是埃塞俄比亚人

  • (国籍前的案文)
黎巴嫩公民身份

  • (国籍后案文)
刚果比利时国籍

  • (国籍加入和)
(1) 德国(b)阿尔及利亚

  • (以1和b作为分隔符)
(a) 俄语(b)格鲁吉亚

  • (带a和b分离器)
a) 法语,b)突尼斯语

  • (带a和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);
        }
    }
}
listOfNationalities=listOfNationalities;
列出多个新列表();
foreach(国家列表中的var国籍)
{
如果(国籍包含(“(1)”)
{
字符串[]nat=national.Split(');
foreach(nat中的var项)
{
多个。添加(项);
}
}
}

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

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));
listOfNationalities=listOfNationalities;
列表有效性=新列表();
有效国籍。添加(“巴西”);
有效国籍。添加(“日语”);
有效性。添加(“…”);
List 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));
string listOfNationalities=string.Join(“|”,listOfNationalities);
列表有效性=新列表();
有效国籍。添加(“巴西”);
有效国籍。添加(“日语”);
有效性。添加(“…”);
List multiple=validNationalities.Where(n=>listOfNationalities.Contains(n));

这样,您将获得给定的两个国籍。

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

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));
listOfNationalities=listOfNationalities;
列表有效性=新列表();
有效国籍。添加(“巴西”);
有效国籍。添加(“日语”);
有效性。添加(“…”);
List 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));
string listOfNationalities=string.Join(“|”,listOfNationalities);
列表有效性=新列表();
有效国籍。添加(“巴西”);
有效国籍。添加(“日语”);
有效性。添加(“…”);
List multiple=validNationalities.Where(n=>listOfNationalities.Contains(n));

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

如果您已经有一个有效国籍的列表,并且如果国籍不包括特殊字符,那么您可以在运行时使用类似以下的方法来创建正则表达式模式:

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"
}

如果您已经有一个有效国籍的列表,并且国籍不包括特殊字符,那么您可以在运行时使用类似于以下的方法来创建正则表达式模式:

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"
}

根据要分析的文本量、频率和性能要求,拥有多个正则表达式可能是一个非常好的解决方案,因为它更易于阅读和维护。您是否已经有一个正则表达式(因为如果您有一个国家列表,我想您不需要正则表达式)@charlesLgn不我没有任何正则表达式为什么你认为你需要使用正则表达式?如果您有国籍列表,只需检查您的字符串是否包含“NationalitiesList”中的国籍之一。@SeM我认为正则表达式会根据要分析的文本量、频率和性能要求限制代码的长度,拥有多个正则表达式可能是一个很好的解决方案,因为它更易于阅读和维护。您是否已经有一个正则表达式(因为如果您有一个国籍列表,我认为您不需要正则表达式)@charlesLgn否我没有任何正则表达式为什么您认为需要使用正则表达式?如果你有