所以我有一个字符串“我有一辆大红车”
我希望用户能够以任何顺序放入部分字符串。所以他们可以写“CAR BIG RED”并且会找到字符串。我知道我可以通过使用 Regex 字符串执行多个 IsMatch 调用来做到这一点,或者我可以使用一个带有锚点的字符串,例如"^(?=.*CAR)(?=.*RED)(?=.*BIG).*$"
. 我想知道什么是最好的选择,或者有更好的选择吗?
注意:我使用的是 C#,所以任何 .net 正则表达式都可以工作。欢迎所有建议。
走出正则表达式的领域,你可以做这样的事情:
string s = "I have a BIG RED CAR";
var searchTerms = "CAR BIG RED".Split(' ').ToList();
var hasTerms = searchTerms.All(s.Contains);
您可以只检查字符串中的单词与搜索字符串中的单词。
如果你愿意,你可以使用 Linq
List<string> items = new List<string>
{
"I have a BIG RED CAR",
"I have a BIG GREEN TRUCK",
"I have a BIG YELLOW BOAT"
};
string searchString = "CAR BIG RED";
string result = items.FirstOrDefault(x => searchString.Split(' ').All(s => x.Split(' ').Contains(s)));
您可以将RegEx
所有单个单词连接成一个以竖线分隔的字符串,并与\b
运算符一起使用来检查整个单词。
string sentance = "I have a BIG RED CAR";
string searchString = "CAR BIG RED";
string regexPattern = string.Format(@"\b({0})\b", searchString.Replace(" ","|"));
if (Regex.IsMatch(sentance, regexPattern))
{
// found all search words in string
}
但是,使用 RegEx 可以有更好的方法来做到这一点,我只知道 RegEx 的基础知识
一个没有 LINQ 的简单想法:
var st = "CAR BIG RED".Split(' ');
var sm = "I have a BIG RED CAR";
bool res = true;
foreach (string s in st)
res &= sm.Contains(s);
您也可以使用Array.FindAll方法。请参阅链接中的示例。