Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用正则表达式替换引号外的空格_C#_.net_Regex_String - Fatal编程技术网

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

C# 使用正则表达式替换引号外的空格,c#,.net,regex,string,C#,.net,Regex,String,使用C#,我需要准备一个搜索文本,以便使用LIKE命令在SQL Server数据库中搜索,方法是将引号外的所有空格替换为%字符。例如: 输入: my "search text" 输出: %my%search text% 任何帮助都将不胜感激。在替换文本之前,我可以处理带有奇数引号的输入字符串。不要使用RegEx,而是在每个字符上使用一个简单的状态机循环,注意引号是“in”还是“out”,并且只在处于“out”状态时替换空格。如果必须使用RegEx,如果您确定所有引号都正确平衡,并且字符串中没

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

输入:

my "search text"
输出:

%my%search text%

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

不要使用
RegEx
,而是在每个字符上使用一个简单的状态机循环,注意引号是“in”还是“out”,并且只在处于“out”状态时替换空格。

如果必须使用RegEx,如果您确定所有引号都正确平衡,并且字符串中没有转义引号(
\“
),则可以执行此操作(也可以考虑转义引号,但这会使正则表达式更加复杂)

这将检查字符串的其余部分,以在当前空格字符后断言偶数个引号。超前(感谢Alan Moore!)的优点是它比落后(Lookback)更便于移植(除了.NET和其他一些正则表达式之外,大多数正则表达式都不支持在落后断言中无限重复).它也可能更快

涉及查找的原始解决方案如下所示:

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);
resultString=Regex.Replace(subjectString,

@(?如果双引号没有以某种方式转义,那么下面是另一种可能性。可能没有某些方法那么有效(当然也没有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 value=“\'first\'some text\'other in quotes\'out\'in them\”;
string[]set=value.Split(“\”);
StringBuilder newvalue=新StringBuilder(“%”);
for(int i=0;i
您似乎还希望删除引号,并在搜索字符串的开头和结尾添加一个
%
。请尝试以下操作:

string s0 = @"my ""search text""";

Regex re = new Regex(@"(?x)
    (?:
       (?<term>[^\s""]+)
     |
       ""(?<term>[^""]+)""
    )
    (?:\s+|$)");

string s1 = @"%" + re.Replace(s0, @"${term}%");
Console.WriteLine(s1);

我会这样做:

 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
  }
私有静态字符串删除未引用的空白(字符串文本)
{    
字符串结果=string.Empty;
var parts=text.Split(“”);
对于(int i=0;i
谢谢,这显然比regex方法简单得多。我仍然需要用1%替换几个连续的空格,但这并不困难(我使用regex完成了这一部分)。@Andreas:不错的选择。你应该接受@Oded的答案(单击旁边的复选标记)。
%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
  }