我想在sql server中搜索,用户可以将关键字设为"java script" j2ee
。我想将j2ee
之前的每个空格替换为AND
,而不是java
和javascript
之间的空格。
到目前为止我的代码:
objCandidateShortInfo.strKeyWord =
"(" +
txtAllKeywords.Value.Trim()
.ToUpper()
.Replace(",", " ")
.Replace("AND NOT", "")
.Replace("AND", "")
.Replace("OR", "")
.Replace(" ", " ")
.Replace(" ", " AND ")
+ ")";
它用AND
替换所有空格,但我不想替换双引号中的空格。
你能建议解决我的问题吗?
答案 0 :(得分:1)
为了解决这个问题,您应该通过空白分割,然后再次组装用引号括起来的部分。以下示例显示了如何执行此操作的算法。我有意使用了一个无效的输入字符串,最后只有一个开头的引号。输入字符串
Test0" Test1 Test2" " Test3 Test4
导致以下搜索字符串
Test0 AND" Test1 Test2" AND" Test3 Test4"
算法首先按空白分割。然后它在结果数组上运行并重建用引号括起来的块。这是在ParseString
类的Parser
方法中完成的。获取部件后,这些部件将由string.Join(" AND ", parts)
连接,以便构建搜索字符串。
void Main()
{
var input = "Test0 \"Test1 Test2\" \"Test3 Test4";
var parts = new Parser().ParseString(input);
foreach(var part in parts)
Console.WriteLine(part);
var searchString = string.Join(" AND ", parts);
Console.WriteLine("SearchString = " + searchString);
}
public class Parser
{
public IEnumerable<string> ParseString(string input)
{
// Split by blanks
var parts = input.Split(' ');
var consolidatedParts = new List<string>();
for(int i = 0; i < parts.Length; i++)
{
var part = parts[i];
// If part starts a block of quotes, add the following parts
// until either a closing quotation mark is found or the end
// is reached
if (part.StartsWith("\""))
{
while (++i < parts.Length)
{
part += " " + parts[i];
if (parts[i].EndsWith("\""))
break;
}
if (!part.EndsWith("\""))
part += "\"";
}
consolidatedParts.Add(part);
}
return consolidatedParts.AsReadOnly();
}
}
在您的代码示例中,首先从输入字符串中删除一些单词(例如AND,AND NOT)。您需要在拆分字符串之前执行此操作。
答案 1 :(得分:0)
您可以先split
代币,然后join
使用AND
s:
objCandidateShortInfo.strKeyWord
= string.Join(" AND ", txtAllKeywords.Value.Split('"'));