要解析此片段:
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"
我必须忽略Number
和Title
单词中的空格。我不能只从正则表达式和输入文本中删除空格,因为我必须在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"
答案 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)
}
}
这将检查输入的版本是否删除了空格是否与模板匹配。我们不能使用它,因为我们在标题中需要空格,但这至少可以验证格式。然后,它使用容忍的正则表达式进行匹配,保存两个所需的字段。