我有一个正则表的列表,我迭代它来查找字符串的匹配模式。
我想获得与" 00000.00"完全匹配的正则表达式的索引,这是1.然而,正则表达式0也返回true,但是如果有数字则应该只返回true或长度为5或6的字符串。
含义,12345和123456应该有效,但12345.0或123456.0不应该有效。
List<Regex> regexPatterns = new List<Regex>{
new Regex(@"\b\d{5,6}\b"), // 0
new Regex(@"\b\d{5,6}[.](00)\b") // 1
}
string text = "00000.00";
for( int i = 0; i < regexPatterns.Count; i++ ) {
if( regexPatterns.IsMatch(text) ) return i;
}
当我希望它返回1时,这为00000.00保持返回0.
**索引有意义,所以重新排序是不可以的。
答案 0 :(得分:2)
请尝试^
和$
作为字符串的开头和结尾:
List<Regex> regexPatterns = new List<Regex>{
new Regex(@"^\d{5,6}$"), // 0
new Regex(@"^\d{5,6}[.](00)$"), // 1
}
请参阅Regular Expression Language - Quick Reference:
^
匹配必须从字符串或行的开头开始。
$
匹配必须发生在字符串的末尾,或者在行或字符串末尾的\n
之前。
答案 1 :(得分:0)
由于时间段将充当单词边界,您最好的选择是从最复杂的模式扫描到最简单的模式。您可以执行for循环递减来完成此操作,但另一种考虑的方法是使用模式的字典,其中值组件是返回值。
var patterns = new Dictionary<string, int>
{
{ @"\b\d{5,6}\b", 0 },
{ @"\b\d{5,6}[.](00)\b", 1 },
};
string text = "00000.00";
foreach (var pattern in patterns.Keys)
{
if (pattern.IsMatch(text))
return patterns[pattern];
}
答案 2 :(得分:0)
检查第一个中没有句号:
List<Regex> regexPatterns = new List<Regex>{
new Regex(@"\d{5,6}[^.]"), // 0
new Regex(@"\d{5,6}[.](00)") // 1
}
string text = "00000.00";
for( int i = 0; i < regexPatterns.Count; i++ ) {
if( regexPatterns.IsMatch(text) ) return i;
}