我有以下模式>4.66<
我想在字符串中找到。以下代码用于查找模式并为med提供double值:
string data = File.ReadAllText("test.txt");
string pattern = "^>\\d.\\d<";
if (Regex.IsMatch(data, pattern))
{
MatchCollection mc = Regex.Matches(data, pattern);
foreach (Match m in mc)
{
double value = double.Parse(m.Value.Substring(1, m.Value.Length - 1));
string foo = "" + 2;
}
}
我认为我的模式是错误的,因为我似乎无法找到&gt; 4.66&lt;我在源头看到它就在那里:D
答案 0 :(得分:1)
使用以下正则表达式:
(?<=>)\d+\.\d+(?=<)
稍微简化的代码:
string data = File.ReadAllText("test.txt");
MatchCollection mc = Regex.Matches(data, @"(?<=>)\d+\.\d+(?=<)");
foreach (Match m in mc)
{
double value = double.Parse(m.Value, CultureInfo.InvariantCulture);
}
您不需要调用IsMatch
方法,因为Matches
只会在没有匹配的情况下返回空集合。
答案 1 :(得分:1)
主要是,你错过了quantifier。使用\d
,您恰好匹配1位数。如果你想匹配更多,你需要定义它。
+
是一个量词,重复前一个项目1或更多。
要按字面匹配一个点,需要对其进行转义,因为它is a special character in regex。
使用逐字字符串以避免双重转义
仅将您需要的内容(like Ulugbek described)与lookaround assertions匹配或使用capturing group
我从您的模式中删除了^
,因为这与字符串的开头匹配,并且您写道要在字符串中查找。
所以我们最终得到:
string pattern = @">(\d.\d+)<";
MatchCollection mc = Regex.Matches(data, pattern);
foreach (Match m in mc)
{
double value = double.Parse(m.groups[1]);
}