我需要构建正则表达式的帮助

时间:2019-11-24 13:27:06

标签: c# .net regex

这是我第一次使用正则表达式,我有点迷茫。为了给您提供一些背景知识,我正在制作一个程序,该程序逐行读取文本文件,并将其保存在名为“ line”的字符串中。如果该行以制表符o或空格开头,然后是数字或数字和点(例如1或1.2.1),然后是另一个制表符或空格,则它将行复制到另一个文件中。

到目前为止,我已经构建了此正则表达式,但是它不起作用

            string pattern = @"(\t| ) *[0-9.] (\t| )";

            if (line.StartsWith(pattern))
            {

                //copy line

            }

line.StartsWith是否正确?还是应该使用rgx.Matches(pattern)之类的东西?

1 个答案:

答案 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]匹配单个制表符或空格

Regex demo | C# demo

例如

string s = "\t1.2.1 ";
Regex regex = new Regex(@"^[ \t][0-9]+(?:\.[0-9]+)*[ \t]");

if (regex.IsMatch(s)) {
    //copy line
}