8

所以我有一个字符串“我有一辆大红车”

我希望用户能够以任何顺序放入部分字符串。所以他们可以写“CAR BIG RED”并且会找到字符串。我知道我可以通过使用 Regex 字符串执行多个 IsMatch 调用来做到这一点,或者我可以使用一个带有锚点的字符串,例如"^(?=.*CAR)(?=.*RED)(?=.*BIG).*$". 我想知道什么是最好的选择,或者有更好的选择吗?

注意:我使用的是 C#,所以任何 .net 正则表达式都可以工作。欢迎所有建议。

4

4 回答 4

13

走出正则表达式的领域,你可以做这样的事情:

string s = "I have a BIG RED CAR";

var searchTerms = "CAR BIG RED".Split(' ').ToList();
var hasTerms = searchTerms.All(s.Contains);
于 2013-05-27T03:34:32.133 回答
4

您可以只检查字符串中的单词与搜索字符串中的单词。

如果你愿意,你可以使用 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 的基础知识

于 2013-05-27T03:31:35.067 回答
0

一个没有 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);
于 2013-05-27T04:21:24.363 回答
0

您也可以使用Array.FindAll方法。请参阅链接中的示例。

于 2013-05-27T05:31:16.597 回答