2012-03-07 93 views
2
string = myfx("{0}test123", test); 
string2 = myfx("actual string"); 

上面的行只是文本文件中几行10行文本。我遍历文本文件,并想知道是否有一个单一的正则表达式将覆盖上面显示的两种情况。正则表达式可选字符

目标字符串是“test123”和“实际字符串”。有没有办法告诉正则表达式在发生时不要拉入“{0}”?

+0

很抱歉,如果这是一件显而易见的,但什么是'myfx'?所以你想匹配字符串“test123”和“实际字符串”..什么是“{0}”与它有关? – 2012-03-07 00:30:51

+0

所以,你试图解析一个非常特定的C#子集?你想得到什么字符串的规则?线条究竟如何?你有什么尝试? – svick 2012-03-07 00:45:18

+0

除非myfx是变相的string.Format? – 2012-03-07 00:59:15

回答

1

要查找所有文本内部没有大括号,使用正则表达式:

(?<=^|\})(?<!\{)[^\{\}]+(?<!\})(?=\{|$) 

测试:

Regex filter = new Regex(@"(?<=^|\})(?<!\{)[^\{\}]+(?<!\})(?=\{|$)"); 
string text = "Blah { Bleh} Blih {Bloh } Bluh"; 
foreach (Match match in filter.Matches(text)) 
{ 
    Console.WriteLine("\"{0}\"", match.Capture[0].Value); 
} 
Console.ReadLine(); 

输出:

"Blah " 
" Blih " 
" Bluh" 

此方法仍有局限性。它假定大括号是成对的。虽然有更多的工作可以做出不错的选择,但我希望它适合你的情况。

+0

你的正则表达式匹配“oops!”在''Blah {oops!} Bleh {1} Bloh''中,尽管它*在花括号内。 – 2012-03-07 02:19:53

+0

@IgorKorkhov,它的确如此。编辑... – 2012-03-07 04:16:41

+0

如果您可以假定花括号总是正确配对,那么您只需:[^ {}] +(?![^ {}] *})''。但我不认为这是OP所要求的。 – 2012-03-07 08:46:52

0

你可以使用:

string myfx = "{0}test123"; 
Regex regex = new Regex("(test123|actual string)"); 
string capturedValue = regex.Match(myfx).Captures[0].Value; 
+3

这太有点太过于字面值了,你不能假设所有几十行都包含完全相同的文本。 – 2012-03-07 01:07:19

0

编辑:M42是正确的周边没有工作。

也许是:

string input = "{9}test123";//"regular string" 
var pattern = @"(?>\{\d\})?(?<target>[^""]+)"; 
var match = Regex.Match(input, pattern); 
string result = match.Groups["target"].ToString(); 
+0

由于其中的空间不匹配“实际字符串”。 – Toto 2012-03-07 09:24:39

+0

更改为“非双引号”.... – sweaver2112 2012-03-07 09:28:43