У меня проблема с регулярным выражением в C #.
Я использовал шаблоны тезисов в F #, и он отлично работает, поэтому я не понимаю, почему он не будет работать в C #.
Итак, допустим, у меня есть входной файл мулинов. Мне нужно проанализировать этот файл для конкретных данных:
Exemple:
Lorem ipsum dolor sit amet, consectetur adipiscing elit (Token1 : 42)
Aliquam id ante ut ante tempus fringilla Token2 (ante ut ) : 45
Morbi varius adipiscing lacus, eget pellentesque tellus vulputate Token3 : 43
Мне нужно извлечь числа, записанные после Token1, Token2, Token3, в одном совпадении (т.е. просто хочу получить мой номер в результате).
Шаблоны, которые я использовал в F #, следующие:
PatternToken1 = "(?:Token1 : )(\d+)"
PatternToken2 = "(?:Token2.* : )(\d+)"
PatternToken3 = "(?:Token3 : )(\d+)"
Итак, моя проблема заключается в следующем:
шаблон, соответствующий моей входной строке в F #, даст мне следующие результаты:
MatchedToken1 = 42
MatchedToken2 = 45
MatchedToken3 = 43
В C # я бы получил следующие результаты:
MatchedToken1 = Token1 : 42
MatchedToken2 = Token2 (ante ut ) : 45
MatchedToken3 = Token3 : 43
Почему это работает в F #, а не в C #? Какой тип шаблона я должен использовать, чтобы он работал в C #?
EDIT:
Вот код, который я использую, чтобы соответствовать моим шаблонам в c #:
abstract class PatternMatcherBaseEntity<T>
{
protected Regex Pattern;
protected T Match;
private static TK Convert<TK>(string input)
{
TK res=default(TK);
var converter = TypeDescriptor.GetConverter(typeof(TK));
if(converter != null)
{
try
{
res = (TK) converter.ConvertFromString(input);
}
catch (Exception)
{
res = default(TK);
}
}
return res;
}
protected bool Matcher(string s)
{
var res = false;
//var matchedData = Regex.Match(s, Patterm);
var content = Pattern.Matches(s);
if(content.Count>0)
{
//Match = Convert<T>(content.Value);
Match = Convert<T>(content[0].Value);
res = true;
}
return res;
}
public T MatchGetter(String stringToMatch)
{
T ret = default(T);
if(stringToMatch != String.Empty)
{
ret = stringToMatch.Match()
.With(Matcher, x => Match)
.Else(x => default(T))
.Do();
}
return ret;
}
}
кстати, я проверял использование дословных и escape-строк. В противном случае он не будет компилироваться