2010-07-26 3 views
1

Как бы преобразовать это в C# из VB.net. Я попробовал онлайн-конвертеры, но у меня появились ошибки, когда я поместил его в свой проект.VB.net Regex to C#

Dim regexinfo As String = String.Empty 
Dim p = "\[news\](?<info>.*?)\[/news\]" 
Dim Matches = Regex.Matches(response, p, RegexOptions.IgnoreCase Or RegexOptions.Singleline) 
If Matches IsNot Nothing AndAlso Matches.Count > 0 Then 
    For Each Match As Match In Matches 
     If Match.Groups("info").Success Then 
      regexinfo = (Match.Groups("info").Value) 
     End If 
    Next 
End If 
+0

Можете ли вы уточнить, какие ошибки вы получили? – siride

ответ

6

Я предполагаю, что это переменная «Матч», названная так же, как и тип, вызывающий проблемы. Это должно делать то, что вы хотите:

var p = @"\[news\](?<info>.*?)\[/news\]"; 
var Matches = Regex.Matches(response, p, RegexOptions.IgnoreCase | RegexOptions.Singleline); 
string regexinfo = Matches.LastOrDefault(m=>m.Groups("info").Success) ?? string.Empty; 

Этот код функционально эквивалентен исходному VB.Net, несмотря на то, что это только 3 линии вместо 10 (и это легко может быть только 1).

Например, условие «если» в исходном коде не было необходимо, так как функция Matches() вернет пустую коллекцию, а не null, а ?? string.Empty() фрагмент позаботится об обнаруженном случае. Так что, несмотря на то, что код изменился, поведения не было. Однако это не дело C# vs VB; VB.Net мог сделать это и в одной строке. Возможно, вы захотите сделать дальнейшее улучшение, используя FirstOrDefault(), а не LastOrDefault(). Просто последний совпадает с вашим оригиналом, а бывший - нет.

+0

Мне нужно это сделать для каждого [новости] [/ news], чтобы я мог в принципе получить все между ними. [постер] [/ постер] [дата] [/ date] [контент] [/ content] – xZerox

+0

@xzerox Этот код сделал то, что сделал ваш оригинал. Если вам нужно изменить это, это новая проблема. Это достаточно легко сделать - просто измените его, чтобы вернуть IEnumerable и использовать проекцию .Select(). –