我只想用一个正则表达式从这个文本中获取名称:
Name:
Paul Rao
Company:
Fix UR Gadget
我应该只得到Paul Rao
我试过(?<=Name:)[\s\S]*\n
但它不起作用,有什么想法吗?
零件名称:(换行符,空格...)实际名称(空格...换行符)将是相同的,但公司不会总是下面的文本。
有任何想法吗 ?
这个怎么样:^Name:[^\S\n]$\n(.*)\n
var match = Regex.Match(text, @"Name:[\s]*(.+)(?:$|\r)");
var name = match.Groups[1].Value;
很好的尝试一下你的后视。你只是忘了那里有一条新线。
(?<=Name:\n)([^\n]*+)
现在第二组应该匹配它。
string text = @"
Name:
Paul Rao
Company:
Fix UR Gadget
";
Regex re = new Regex(@"Name:\s*\n(.+?)\s*\n");
Match m = re.Match(text);
if (m.Success)
{
string name = m.Groups[1].Value;
}
(?<=Name:[\s\S\n]*)[a-zA-Z\s\-]*
(?<=Name:[\s\S]*)
确保匹配前有单词“Name”、分号和任意数量的空白字符。(你甚至可能想用 切换*
,+
因为你可以保证空格,但这会起作用)
[a-zA-Z\s\-]*
匹配任意数量的字母、空格或连字符(因为连字符是名称的有效字符)。听说过 La-a (Luh-dash-uh) 的故事吗?甚至可能还有其他有效字符,我不知道。
有任何想法吗?不,因为它是关于正则表达式的问题;是的,因为如果没有正则表达式的危害人类罪,解析实际上会很有趣。
例如,看看这个网站上的教程(不确定这是否是你最好的选择;我自己没有在 .NET 上完成解析,但表面上看起来很棒)
http://www.quanttec.com/fparsec/
如果你愿意花一个小时左右的小时间投入,我保证你不会回头。
如果您使用组捕获,则可以避免使用lookbehind:
var result = Regex.Match(text, @"Name:[\r\n ]+([^\r\n]*)[\r\n ]+")
你的结果是result.Groups[1].Value.TrimEnd()