这个问题与我之前提出的问题非常相似(This Question),但我需要稍微改变一下。
所以在早期的问题中这个字符串
Berkshire Hathaway Inc (Ticker: BRK; NAICS: 524126, 511130, 335212, 445292, 511110, 442210; Duns: 00-102-4314) Walt Disney Co (Ticker: DIS; NAICS: 713110, 512110, 711211, 515120; Duns: 00-690-4700)
使用以下值创建2个匹配项:
Berkshire Hathaway Inc Walt Disney Co
现在我希望匹配包含Ticker:XXX或公司名称,首选为Ticker:XXX。
因此,对于上面的示例,它将匹配:
Ticker: BRK Ticker: DIS
对于这个例子:
Berkshire Hathaway Inc (NAICS: 524126, 511130, 335212, 445292, 511110, 442210; Duns: 00-102-4314) Walt Disney Co (Ticker: DIS; NAICS: 713110, 512110, 711211, 515120; Duns: 00-690-4700)
结果将是:
Berkshire Hathaway Inc Ticker: DIS
我想我只是不理解上一个问题中的正则表达式解决方案,足以理解如何修改它以适应这种模式。
正则表达式是用c#
编写的顺便说一下,之前的正则表达式解决方案是:
(?!\s*$)(.*?)(?:\([^)]*(?:(?:SIC|NAICS):[^)]*)+\)|$)
我想现在应该改为:
(?!\s*$)(.*?)(?:\([^)]*(?:(?:SIC|NAICS|Duns):[^)]*)+\)|$)
但如何提取Ticker:如果Ticker存在,则选择该值而不是其他值?
答案 0 :(得分:4)
我还在学习正则表达式,所以我不确定你是否可以在组上使用条件逻辑。但是,作为替代方案,您可以按如下方式修改正则表达式,以便它还可以捕获股票代码组(如果存在):
(?!\s*$)(.*?)(?:\((Ticker:[^;]+)?[^)]*(?:(?:SIC|NAICS|Duns):[^)]*)+\)|$)
然后你可以在你的c#代码中执行逻辑。我猜这样的事情会起作用:
Regex regex = new Regex(@"(?!\s*$)(.*?)(?:\((Ticker:[^;]+)?[^)]*(?:(?:SIC|NAICS|Duns):[^)]*)+\)|$)");
Match match = regex.Match("Berkshire Hathaway Inc (NAICS: 524126, 511130, 335212, 445292, 511110, 442210; Duns: 00-102-4314) Walt Disney Co (Ticker: DIS; NAICS: 713110, 512110, 711211, 515120; Duns: 00-690-4700)");
while (match.Success) {
if (match.Groups[2].Success)
{
Console.WriteLine(match.Groups[2].Value);
}
else
{
Console.WriteLine(match.Groups[1].Value);
}
match = match.NextMatch();
}
输出:
Berkshire Hathaway Inc
Ticker: DIS
答案 1 :(得分:2)
我建议使用像Expresso这样的工具来制定正则表达式。它专为C#Regex设计,甚至可以将您需要使用的代码复制到剪贴板中。您可以将示例粘贴到工具中,然后调整正则表达式直到它工作。我发现像这样的工具是编写正则表达式的必备工具。