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

时间:2011-05-24 14:10:32

标签: c# .net regex string

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

输入:

my "search text"

输出:

%my%search text%

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

5 个答案:

答案 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
  }