C# 获取介于“之间”的短语&引用;这有一个特别的词
假设我有以下文本: “当我长大的时候,我们住在一个地下室很满的小房子里。”妈妈用地毯铺在水泥地板上,沙发和椅子让地下室很舒适,我们可以在上面玩,那是我们保存大部分玩具和我们珍爱的东西的地方 我们在那些木楼梯上来回走了很多次,过了一会儿,它们开始显得非常破旧。妈妈决定要画它们。那是在快干油漆投入使用之前的几天,油漆需要一整天的时间才能干燥。" 我需要一个以“.”分隔开始和结束的正则表达式,它包含两个特定的单词(示例->基底),结果是: “妈妈在地下室里铺了一块地毯,铺在水泥地面上,还有一张沙发和椅子,我们可以在上面玩。”C# 获取介于“之间”的短语&引用;这有一个特别的词,c#,.net,regex,.net-core,C#,.net,Regex,.net Core,假设我有以下文本: “当我长大的时候,我们住在一个地下室很满的小房子里。”妈妈用地毯铺在水泥地板上,沙发和椅子让地下室很舒适,我们可以在上面玩,那是我们保存大部分玩具和我们珍爱的东西的地方 我们在那些木楼梯上来回走了很多次,过了一会儿,它们开始显得非常破旧。妈妈决定要画它们。那是在快干油漆投入使用之前的几天,油漆需要一整天的时间才能干燥。" 我需要一个以“.”分隔开始和结束的正则表达式,它包含两个特定的单词(示例->基底),结果是: “妈妈在地下室里铺了一块地毯,铺在水泥地面上,还有一张沙发和椅
你可以用这个正则表达式
[A-Z][^.]*the basement[^.]*\.
说明:
[A-Z]
-此正则表达式开始与大写字母匹配,就像句子开始与大写字母匹配一样
[^.]*
-然后它后面可以跟零个或多个字符,而不是文字点
<代码>地下室——接着是你想要的文本,在它的中间。
[^.]*
-然后它后面可以跟零个或多个字符,而不是文字点
\。
-最后以文字点结束
这里有一个稍微稳健的解决方案。它处理时段(即句号),但不处理“点”(例如“上午8:00”或“例如”)
void Main()
{
变量s=
@“当我长大的时候,我们住在一个地下室很满的小房子里。妈妈用一块铺在水泥地板上的地毯和一张沙发和椅子让地下室很舒适,我们可以在上面玩。我们的大部分玩具和我们珍爱的东西都放在那里。”。
我们上下那些木楼梯很多次,过了一会儿,它们开始看起来很破旧。妈妈决定要给它们上漆。那是在快干漆开始使用之前的几天,油漆需要一整天的时间才能干。”;
控制台.书写线(Foo(s),"the","地库";;
}
IEnumerable Foo(字符串s,参数字符串[]个字)
{
var regexes=从w中选择新的Regex(w,RegexOptions.IgnoreCase);
var xs=新堆栈();
推送(newlist());
foreach(s中的变量c)
{
xs.Peek().Add(c);
如果(c=='。)
推送(newlist());
}
varcandidates=xs.Reverse().Select(x=>newstring(x.ToArray());
foreach(候选人中的var候选人)
if(regexes.All(x=>x.IsMatch(候选)))
收益率候选人;
}
你能给我们提供你已经尝试过的代码吗?你还需要给我们提供一个实际的问题。一个小小的编辑有助于解决这样一个容易回答的问题。一段巨大的未区分的文本太难浏览了。这么多问题。你想能够处理中间的专有名词吗?你的句子?引号怎么办?以感叹号或问号结尾的句子怎么办?如果句子是第一个句子,前面没有句号怎么办?如果结尾的句号被省略怎么办?如果有多个匹配怎么办?如果“the”和“the”之间的间距“是否不一致?句首大写字母?一般来说,这可能行不通。如果你在句子的中间有一个专有名词,那么英语怎么办呢?我们上午8点在地下室见。
void Main()
{
var s =
@"When I was growing up, we lived in a little house with a full basement. Mom made the basement cozy with a rug covering the concrete floor and a couch and chair that we could play on. , and that was where we kept most of our toys and the things we treasured.
We went up and down those wooden stairs many times, and after a while they began to look pretty scuffed and scruffy. Mom decided she was going to paint them. That was in the days before quick-drying paints came into use, and it would take a full day for the paint to dry.";
Console.WriteLine(Foo(s, "the", "basement"));
}
IEnumerable<string> Foo(string s, params string[] words)
{
var regexes = from w in words select new Regex(w, RegexOptions.IgnoreCase);
var xs = new Stack<List<char>>();
xs.Push(new List<char>());
foreach (var c in s)
{
xs.Peek().Add(c);
if(c == '.')
xs.Push(new List<char>());
}
var candidates = xs.Reverse().Select (x => new string(x.ToArray()) );
foreach (var candidate in candidates)
if(regexes.All(x => x.IsMatch(candidate)))
yield return candidate;
}