我正在尝试过滤大型文本文件中的某些字符串。我想让字符串以某个单词开头并以引号结尾,但只是从该单词的最后一个点开始的该字符串的最后一部分。更确切地说,我在文档中搜索类名,从基本命名空间开始,但我不需要完全限定的类名,只需要类名本身。 (例如,不是"NamespaceA.NamespaceB.NamespaceC.Classname"
,只有"Classname"
。
例如,从这个字符串:
sddkjasd"fhadslkfhdskljfahskjff"shkdfjhfkhafklj"NamespaceA.NamespaceB.NamespaceC.ClassnameA"swenbfjiwguzl"lgvfdu"eQVFZEIW"NamespaceA.NamespaceB.NamespaceC.ClassnameB"VDTZEvwqdtzevdzgi
我想要这些比赛:
ClassnameA
ClassnameB
NamespaceA
将始终相同,因此我可以将此作为起始条件,并使用结束语。标记将永远存在,所以我可以使用它们作为最终条件,但我不知道如何仅使用正则表达式从最后一个点开始选择最后一个作品。当然,我可以解决这个问题,例如:在结果上使用字符串操作(这就是我现在正在做的事情),或者在结果上使用第二个正则表达式,但我感兴趣的是如果有一种方法直接用正则表达式得到这个结果。目前,我与NamespaceA.+?(?=\")
匹配以获得没有结束语的完整命名空间。分数。
答案 0 :(得分:1)
使用否定字符类使正则表达式引擎匹配任何字符,但不匹配"
或点,这样它就不会贪婪地匹配点或引号。
"NamespaceA.*?\.([^."]*)"
OR
"NamespaceA[^"]*?\.([^."]*)"
使用上述任何一个正则表达式并从组索引1中获取类名。
<强>代码:强>
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);
答案 1 :(得分:0)
怎么样:
NamespaceA(?:\.\w+)*\.(\w+)
classNames将在第1组
答案 2 :(得分:0)