.net 如果特定字符串在一行中出现多次,则正则表达式匹配一行

.net 如果特定字符串在一行中出现多次,则正则表达式匹配一行,.net,regex,visual-studio-2015,.net,Regex,Visual Studio 2015,我知道如何在一行中搜索两个不同的特定字符串,但不知道如何检查一个特定字符串在一行中是否出现多次。这能做到吗?它是匹配整行还是匹配字符串本身对我来说并不重要 例如: 我想指定'Spani'并使其匹配 西班牙人说西班牙语 但是不是: 西班牙人说德语 这样的事情可以用我不知道的正则表达式来完成吗?如果没有,是否有方法检查反向,这基本上是一样的: 一个特定的字符串在一行中只出现一次吗?这似乎很简单: Spani.+Spani 假设变量中有“Spani” var toMatch = "Spani";

我知道如何在一行中搜索两个不同的特定字符串,但不知道如何检查一个特定字符串在一行中是否出现多次。这能做到吗?它是匹配整行还是匹配字符串本身对我来说并不重要

例如:

我想指定'Spani'并使其匹配

西班牙人说西班牙语

但是不是:

西班牙人说德语

这样的事情可以用我不知道的正则表达式来完成吗?如果没有,是否有方法检查反向,这基本上是一样的:


一个特定的字符串在一行中只出现一次吗?

这似乎很简单:

Spani.+Spani
假设变量中有“Spani”

var toMatch = "Spani";

var pattern = $"{toMatch}.+{toMatch}";

(不要在
toMatch
中包含正则表达式特殊字符)

你可以构建一个类似于@Steven Doggart在上面的评论中所提到的正则表达式,这样你就可以得到:
^.*(Spani.*){2}$

您应该使用以确保不搜索任何正则表达式保留字符

using System.Text.RegularExpressions;

public bool HasMatches(string input, string search, int times)
{
    var pattern = $"^.*({Regex.Escape(search)}.*){{{times}}}";
    return Regex.IsMatch(input, pattern, RegexOptions.Multiline);
}
然后像这样运行它:

var input = "The Spaniard speaks Spanish";
HasMatches(input, "Spani", 2);

input = "The Spaniard speaks German";
HasMatches(input, "Spani", 2);

input = "The Spaniard speaks Spanish" + Environment.NewLine + "The Spaniard speaks German";
HasMatches(input, "Spani", 2);

^.*(Spani.*{2}$
启用多行选项后,如何返回长度为n且出现多个
Regex.Escape
-很好!你真的需要开头的
^..*
吗?不,实际上可能不需要。这只是将“一行中”的要求直译成正则表达式。