忽略正则表达式中的空格

时间:2020-02-13 13:40:50

标签: c# regex

要解析此片段:

Number: 1235, Title: "Today is a good day"

我正在使用此正则表达式:

^Number: (\d+?), Title: \"(.*?)\"$

不幸的是,现在我必须处理损坏的数据,例如:

Nu mber: 1235, Title: "Today is a good day"
Numb er: 1235, Title: "Today is a bad day"
Nu mbe r: 1235, Title: "Foo"
Number: 1235, T itle: "Bar"
Nu mber: 1235, Tit le: "Example yyy"
Number: 1235, Title: "One"

我必须忽略NumberTitle单词中的空格。我不能只从正则表达式和输入文本中删除空格,因为我必须在Title片段之后的文本中保留空格。

此解决方案似乎有效:

^\s*N\s*u\s*m\s*b\s*e\s*r\s*:\s*(\d+?)\s*,\s*T\s*i\s*t\s*l\s*e\s*:\s*\"(.*?)\"\s*$

但是它确实不可读。有什么想法吗?

我还要提及,我不想匹配这样的东西

Age: 99, Description: "Hi"

1 个答案:

答案 0 :(得分:1)

您不希望在那里出现贪婪的限定词,因为最长和最短的比赛之间没有区别;在您的示例中仅使用^Number: (\d+), Title: \"(.*)\"$会(非常轻微)。

如果您知道它永远只是数字和标题,则可以假定它们:

^N[^:]+:\s+(\d+),\s+T[^:]+:\s+\"(.*)\"$

如果您不能做这个假设,请使用一些C#代码将数据复制到一个临时变量中,折叠该变量中的空白并首先进行检查。

我不了解C#,因此此示例代码可能有错误,但仍然可以传达我的想法:

string input = 'Nu mber: 1235, Title: "Today is a good day"';
Match match = Regex.Match(input.Replace(" ", ""), @"^Number:\d+,Title:\".*\"$");
if (match.Success) {
  match = Regex.Matches(input, @"^N[^:]+:\s+(\d+),\s+T[^:]+:\s+\"(.*)\"$")
  if (match.Success) {
    // do stuff with match[1] (the number) and match[2] (the title)
  }
}

这将检查输入的版本是否删除了空格是否与模板匹配。我们不能使用它,因为我们在标题中需要空格,但这至少可以验证格式。然后,它使用容忍的正则表达式进行匹配,保存两个所需的字段。