问题描述
比如下面一段词:雨恨云愁,江南依旧称佳丽。水村渔市,一缕孤烟细。天际征鸿,遥认行如缀。平生事,此时凝睇,谁会凭栏意?我想提取含有“孤烟”的句子。也就是“水村渔市,一缕孤烟细"一句。请问如何写正则表达式?实际应用时,孤雁可能出现在文章的最开头,也可能是最后一个词。
解决方案
解决方案二:
.*孤烟.*n
解决方案三:
(?<=。).*?孤烟.*?(?=。)
解决方案四:
引用2楼starfd的回复:
(?<=。).*?孤烟.*?(?=。)
这个不行啊。我就想要两个句号之间的数据。如果诗写在一行中,同时我要提取含有“此时”的句子:“雨恨云愁,江南依旧称佳丽。水村渔市,一缕孤烟细。天际征鸿,遥认行如缀。平生事,此时凝睇,谁会凭栏意?”你的表达式会从第一个句号位置开始匹配:“水村渔市,一缕孤烟细。天际征鸿,遥认行如缀。平生事,此时凝睇,谁会凭栏意”
解决方案五:
(?<=。).*?孤烟.*?(?=。)
这个不会像你说的匹配到“孤烟细。”后面的啊(?<=。).*?孤烟.*?此时.*?(?=。|?)
这个才会匹配“水村渔市,一缕孤烟细。天际征鸿,遥认行如缀。平生事,此时凝睇,谁会凭栏意”
解决方案六:
引用4楼starfd的回复:
(?<=。).*?孤烟.*?(?=。)这个不会像你说的匹配到“孤烟细。”后面的啊(?<=。).*?孤烟.*?此时.*?(?=。|?)
这个才会匹配“水村渔市,一缕孤烟细。天际征鸿,遥认行如缀。平生事,此时凝睇,谁会凭栏意”
解决方案七:
staticvoidRegexChinese(){stringtxt=@"雨恨云愁,江南依旧称佳丽。水村渔市,一缕孤烟细。天际征鸿,遥认行如缀。平生事,此时凝睇,谁会凭栏意?";varmatch=Regex.Match(txt,@"(?<=。).*?此时.*?(?=。|?)",RegexOptions.RightToLeft);if(match.Success){Console.WriteLine(match.Value);}}
指定从右往左匹配
解决方案八:
引用6楼starfd的回复:
staticvoidRegexChinese(){stringtxt=@"雨恨云愁,江南依旧称佳丽。水村渔市,一缕孤烟细。天际征鸿,遥认行如缀。平生事,此时凝睇,谁会凭栏意?";varmatch=Regex.Match(txt,@"(?<=。).*?此时.*?(?=。|?)",RegexOptions.RightToLeft);if(match.Success){Console.WriteLine(match.Value);}}指定从右往左匹配
这样的话,匹配“孤烟”又出现错误了。我的需求就是,一个词出现在任意位置都能提取到他所在的那一句话。
解决方案九:
好吧,我给你个终极方案staticvoidRegexChinese(){stringtxt=@"此时雨恨云愁,江南依旧称佳丽。水村渔市,一缕孤烟细。天际征鸿,遥认行如缀。平生事,此时凝睇,谁会凭栏意?此时此时此时";vararr=Regex.Split(txt,"[。?]");foreach(varstrinarr){if(Regex.Match(str,".*?此时.*?").Success){Console.WriteLine(str);}}}
解决方案十:
引用8楼starfd的回复:
好吧,我给你个终极方案staticvoidRegexChinese(){stringtxt=@"此时雨恨云愁,江南依旧称佳丽。水村渔市,一缕孤烟细。天际征鸿,遥认行如缀。平生事,此时凝睇,谁会凭栏意?此时此时此时";vararr=Regex.Split(txt,"[。?]");foreach(varstrinarr){if(Regex.Match(str,".*?此时.*?").Success){Console.WriteLine(str);}}}
应该会有更好的办法吧……~
解决方案十一:
(?<=。)[^。]*?关键字.*?(?=。)
解决方案十二:
(?<=。|?)?[^。|?]*?此时.*?[。|?]
解决方案十三:
楼主你解决了吗?