使用正则表达式替换引号外的空格

使用C#,我需要使用LIKE命令准备一个搜索文本,以便在SQL Server数据库中进行搜索,方法是用%字符替换引号外的所有空格。 例:

输入:

my "search text" 

输出:

 %my%search text% 

任何帮助,将不胜感激。 在替换文本之前,我可以处理具有奇数引号的输入字符串。

如果你必须使用正则表达式,你可以这样做,如果你确定所有引号都是正确平衡的,并且如果字符串中没有转义引号( \" )(也可以考虑那些,但它,使正则表达式更加复杂)。

 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); 

而不是使用RegEx ,使用一个简单的状态机 – 循环遍历每个字符,注意你是否在“引号”或“引出”引号,并且只在你处于“out”状态时替换空格。

如果双引号没有以某种方式转义,则以下是另一种可能性。 可能没有某些方法那么高效(当然也不像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("%"); 

看起来您还想删除引号并在搜索字符串的开头和结尾添加% 。 试试这个:

 string s0 = @"my ""search text"""; Regex re = new Regex(@"(?x) (?: (?[^\s""]+) | ""(?[^""]+)"" ) (?:\s+|$)"); string s1 = @"%" + re.Replace(s0, @"${term}%"); Console.WriteLine(s1); 

输出:

 %my%search text% 

会做这样的事情:

  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 }