这是我第一次使用正则表达式,我有点迷茫。为了给您提供一些背景知识,我正在制作一个程序,该程序逐行读取文本文件,并将其保存在名为“ line”的字符串中。如果该行以制表符o或空格开头,然后是数字或数字和点(例如1或1.2.1),然后是另一个制表符或空格,则它将行复制到另一个文件中。>
到目前为止,我已经构建了此正则表达式,但是它不起作用
string pattern = @"(\t| ) *[0-9.] (\t| )";
if (line.StartsWith(pattern))
{
//copy line
}
line.StartsWith是否正确?还是应该使用rgx.Matches(pattern)之类的东西?
答案 0 :(得分:1)
您的模式包含不带限定符的字符类,该限定符将匹配单个数字或点。
例如,要防止仅匹配点,可以先匹配数字,然后再匹配与点匹配的可选部分,然后再匹配数字[0-9]+(?:\.[0-9]+)*
请注意,在该部分(\t| )
中,由于该部分中的空格具有含义,因此预计将有2个字符匹配。
您可以简化模式,以使用字符类来匹配制表符或空格,而不是使用替代,并且如果不需要捕获组,则可以将其忽略。
例如,您可以使用StartsWith
来代替IsMatch^[ \t][0-9]+(?:\.[0-9]+)*[ \t]
^
字符串的开头[ \t]
匹配单个制表符或空格[0-9]+
匹配1个以上的数字0-9 (?:\.[0-9]+)*
重复0+次点和1+个数字[ \t]
匹配单个制表符或空格例如
string s = "\t1.2.1 ";
Regex regex = new Regex(@"^[ \t][0-9]+(?:\.[0-9]+)*[ \t]");
if (regex.IsMatch(s)) {
//copy line
}