使用C#,我需要使用LIKE命令准备一个搜索文本,以便在SQL Server数据库中进行搜索,方法是用%字符替换引号外的所有空格。例如:
输入:
my "search text"
输出:
%my%search text%
任何帮助将不胜感激。在替换文本之前,我可以处理具有奇数引号的输入字符串。
答案 0 :(得分:11)
不使用RegEx
,而是使用一个简单的状态机 - 遍历每个字符,注意你是否在引号的“in”或“out”中,只在你处于“out”状态时替换空格
答案 1 :(得分:6)
如果 使用正则表达式,如果您确定所有引号都已正确平衡,并且字符串中没有转义引号(\"
),则可以执行此操作(也可以考虑到这些,但它使正则表达式更复杂)。
resultString = Regex.Replace(subjectString,
@"[\ ] # Match a space (brackets for legibility)
(?= # Assert that the string after the current position matches...
[^""]* # any non-quote characters
(?: # followed by...
""[^""]* # one quote, followed by 0+ non-quotes
""[^""]* # a second quote and 0+ non-quotes
)* # any number of times, ensuring an even number of quotes
$ # until the end of the string
) # End of lookahead",
"%", RegexOptions.IgnorePatternWhitespace);
这将检查字符串的其余部分,以在当前空格字符后声明偶数引号。前瞻的优势(感谢Alan Moore!)是它比lookbehind更具可移植性(除了.NET之外的大多数正则表达式以及其他一些不支持lookbehind断言内的无限重复)。它也可能更快。
涉及lookbehind的原始解决方案如下:
resultString = Regex.Replace(subjectString,
@"(?<= # Assert that the string up to the current position matches...
^ # from the start of the string
[^""]* # any non-quote characters
(?: # followed by...
""[^""]* # one quote, followed by 0+ non-quotes
""[^""]* # a second quote and 0+ non-quotes
)* # any number of times, ensuring an even number of quotes
) # End of lookbehind
[ ] # Match a space (brackets for legibility)",
"%", RegexOptions.IgnorePatternWhitespace);
答案 2 :(得分:0)
如果双引号没有以某种方式转义,则以下是另一种可能性。可能没有某些方法那么高效(当然也不像Tim的正则表达式那么酷),但是当下一个人查看代码时,它可能是合理可以理解的。它将字符串拆分为双引号,然后循环遍历值。奇数条目是引号之外的部分,甚至条目也是引号内的部分。
string value = "\"first\" some text \"other in quotes\" out of them \"in them\"";
string[] sets = value.Split('\"' );
StringBuilder newvalue = new StringBuilder("%");
for (int i = 0; i < sets.Length; i++) {
if ( i % 2 == 0 )
// even ones are outside quotes
newvalue.Append( sets[i].Replace( ' ', '%' ));
else
// and the odd ones are in quotes
newvalue.Append( "\"" + sets[i] + "\"" );
}
// final %
newvalue.Append("%");
答案 3 :(得分:0)
看起来您还想删除引号并在搜索字符串的开头和结尾添加%
。试试这个:
string s0 = @"my ""search text""";
Regex re = new Regex(@"(?x)
(?:
(?<term>[^\s""]+)
|
""(?<term>[^""]+)""
)
(?:\s+|$)");
string s1 = @"%" + re.Replace(s0, @"${term}%");
Console.WriteLine(s1);
输出:
%my%search text%
答案 4 :(得分:0)
会做这样的事情:
private static string RemoveUnquotedWhiteSpaces(string text)
{
string result = String.Empty;
var parts = text.Split('"');
for(int i = 0; i < parts.Length; i++)
{
if (i % 2 == 0) result += Regex.Replace(parts[i], " ", "");
else result += String.Format("\"{0}\"", parts[i]);
}
return result
}