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

And*_*eas 5 .net c# regex string

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

输入:

my "search text"
Run Code Online (Sandbox Code Playgroud)

输出:

%my%search text%
Run Code Online (Sandbox Code Playgroud)

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

Ode*_*ded 11

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


Tim*_*ker 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);
Run Code Online (Sandbox Code Playgroud)

这将检查字符串的其余部分,以在当前空格字符后声明偶数引号.前瞻的优势(感谢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);
Run Code Online (Sandbox Code Playgroud)