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