2014-09-24 100 views
0

我想过滤大文本文件中的某些字符串。我想要得到以某个单词开始并以引号结尾的字符串,但只是从该单词中最后一个点开始的该字符串的最后部分。更确切地说,我在文档中搜索类名,从基本名称空间开始,但我不需要完全限定的类名,只需要类名本身。 (例如,不"NamespaceA.NamespaceB.NamespaceC.Classname",只有"Classname"获取匹配字符串的子字符串与RexEx

举个例子,从这个字符串:

sddkjasd"fhadslkfhdskljfahskjff"shkdfjhfkhafklj"NamespaceA.NamespaceB.NamespaceC.ClassnameA"swenbfjiwguzl"lgvfdu"eQVFZEIW"NamespaceA.NamespaceB.NamespaceC.ClassnameB"VDTZEvwqdtzevdzgi 

我想这些比赛:

ClassnameA 
ClassnameB 

NamespaceA永远是一样的,所以我可以使用这是一个起始条件,并且关闭标记将始终存在,所以我可以将它们用作最终条件,但是我不知道如何只选择最后一个从最后一个点开始的工作。正则表达式。当然,我可以工作绕过它,例如对结果使用字符串操作(这正是我现在正在做的),或者对结果使用第二个正则表达式,但是如果有直接使用正则表达式获得此结果的方法,我很感兴趣。目前,我与NamespaceA.+?(?=\")匹配以获取完整的名称空间而不包含结束语。分数。

回答

1

使用否定的字符类,使正则表达式引擎匹配任何字符,但不是"或点,使得它赢得了不要贪婪地匹配点或引号。

"NamespaceA.*?\.([^."]*)" 

OR

"NamespaceA[^"]*?\.([^."]*)" 

使用上述正则表达式中的任何一个,并从组索引1

DEMO

代码的类名:

String input = @"sddkjasd""fhadslkfhdskljfahskjff""shkdfjhfkhafklj""NamespaceA.NamespaceB.NamespaceC.ClassnameA""swenbfjiwguzl""lgvfdu""eQVFZEIW""NamespaceA.NamespaceB.NamespaceC.ClassnameB""VDTZEvwqdtzevdzgi"; 
Regex rgx = new Regex(@"NamespaceA[^""]*?\.([^.""]*)"""); 
foreach (Match m in rgx.Matches(input)) 
Console.WriteLine(m.Groups[1].Value); 

IDEONE

0

如何:

NamespaceA(?:\.\w+)*\.(\w+) 

的类名将会在第1组