string = myfx("{0}test123", test);
string2 = myfx("actual string");
上面的行只是文本文件中几行10行文本。我遍历文本文件,并想知道是否有一个单一的正则表达式将覆盖上面显示的两种情况。正则表达式可选字符
目标字符串是“test123”和“实际字符串”。有没有办法告诉正则表达式在发生时不要拉入“{0}”?
string = myfx("{0}test123", test);
string2 = myfx("actual string");
上面的行只是文本文件中几行10行文本。我遍历文本文件,并想知道是否有一个单一的正则表达式将覆盖上面显示的两种情况。正则表达式可选字符
目标字符串是“test123”和“实际字符串”。有没有办法告诉正则表达式在发生时不要拉入“{0}”?
要查找所有文本内部没有大括号,使用正则表达式:
(?<=^|\})(?<!\{)[^\{\}]+(?<!\})(?=\{|$)
测试:
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"
此方法仍有局限性。它假定大括号是成对的。虽然有更多的工作可以做出不错的选择,但我希望它适合你的情况。
你的正则表达式匹配“oops!”在''Blah {oops!} Bleh {1} Bloh''中,尽管它*在花括号内。 – 2012-03-07 02:19:53
@IgorKorkhov,它的确如此。编辑... – 2012-03-07 04:16:41
如果您可以假定花括号总是正确配对,那么您只需:[^ {}] +(?![^ {}] *})''。但我不认为这是OP所要求的。 – 2012-03-07 08:46:52
你可以使用:
string myfx = "{0}test123";
Regex regex = new Regex("(test123|actual string)");
string capturedValue = regex.Match(myfx).Captures[0].Value;
这太有点太过于字面值了,你不能假设所有几十行都包含完全相同的文本。 – 2012-03-07 01:07:19
编辑:M42是正确的周边没有工作。
也许是:
string input = "{9}test123";//"regular string"
var pattern = @"(?>\{\d\})?(?<target>[^""]+)";
var match = Regex.Match(input, pattern);
string result = match.Groups["target"].ToString();
由于其中的空间不匹配“实际字符串”。 – Toto 2012-03-07 09:24:39
更改为“非双引号”.... – sweaver2112 2012-03-07 09:28:43
很抱歉,如果这是一件显而易见的,但什么是'myfx'?所以你想匹配字符串“test123”和“实际字符串”..什么是“{0}”与它有关? – 2012-03-07 00:30:51
所以,你试图解析一个非常特定的C#子集?你想得到什么字符串的规则?线条究竟如何?你有什么尝试? – svick 2012-03-07 00:45:18
除非myfx是变相的string.Format? – 2012-03-07 00:59:15