C#种处理反斜杠

Ador3 2009-06-11 03:34:30
各位达人,请教下:
C#中
string userName = "admin\billy";
将用户名加入sql语句中,在提交执行时报错,原因就是字符串中的“\b”被解析成了退格,如何将一个反斜杠替换成两个,也就是将原有的那个“\”给转义掉,成为字符!Replace.split,似乎都不行,因为在用这个字符串的时候,“\b”已经被看着退格了,请教如何搞定!
...全文
3052 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamseakingii 2009-06-18
  • 打赏
  • 举报
回复
你给个完整的,导致你这个错误的代码看看.
rabbitlzx 2009-06-18
  • 打赏
  • 举报
回复
难道41楼也不能解决楼主的问题?
看来我还是没明白lz的问题所在啊
Ador3 2009-06-18
  • 打赏
  • 举报
回复
多谢各位的解答,只是没有我要的答案!
在.net中如果我们在一个textbox里面输入“bb\bb”之类的带有反斜杠的字符串,那么微软自动将其转换,不对反斜杠和后面的字符做转义!
所有在程序中,我们得来的一个“字符串变量”中含有反斜杠时。我们是没法解决的,没法替换掉,不让转义的!至少在.net中我还没有找到方法,希望有高人出现!
我的问题已经解决,我的session是从asp中取到asp.net中,所以在asp中先做了转换,不然asp.net中没法处理!也只有这样了!
希望有高人能在asp.net中解决这个问题!
TriSinker 2009-06-13
  • 打赏
  • 举报
回复
晕,这么多人理解错lz的意思。

顶,27楼,33楼正解,33楼更详细地说明了问题。

lz看33的替换方法就行了。
mlliqiushi 2009-06-13
  • 打赏
  • 举报
回复
顶吧,有正解了!·
iamseakingii 2009-06-13
  • 打赏
  • 举报
回复
用正则表达式很简单




using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

public class MyClass
{
public static void Main()
{
//session模拟
//Sesion["username"] = "admin\billy";
//string userName = Session["username"];
string sessionUserName = "admin\billy";
string userName = sessionUserName;
Console.WriteLine("原值:" + userName);
string userNameReplaceOne = userName.Replace(@"\" , @"\\");
Console.WriteLine("替换方法1:" + userNameReplaceOne);
string userNameReplaceTwo = userName.Replace(@"\b",@"\\b");
Console.WriteLine("替换方法2:" + userNameReplaceTwo);




//可行
string [] userNameSplit = userName.Split('\b');
if( userNameSplit.Length ==0 )
Console.WriteLine("替换方法3:" + userNameSplit[0]);
else
Console.WriteLine("替换方法3:" + userNameSplit[0] + @"\b" + userNameSplit[1]);


//可行
string userNameReplaceFour = Regex.Replace(userName,"\b",@"\b");
Console.WriteLine("替换方法4:" + userNameReplaceFour);



Console.Read();
}
}



iamseakingii 2009-06-13
  • 打赏
  • 举报
回复
确实已存在的转义字符串不能用Replace...




using System;
using System.Collections.Generic;

public class MyClass
{
public static void Main()
{
//session模拟
//Sesion["username"] = "admin\billy";
//string userName = Session["username"];
string sessionUserName = "admin\billy";
string userName = sessionUserName;
Console.WriteLine("原值:" + userName);
string userNameReplaceOne = userName.Replace(@"\" , @"\\");
Console.WriteLine("替换方法1:" + userNameReplaceOne);
string userNameReplaceTwo = userName.Replace(@"\b",@"\\b");
Console.WriteLine("替换方法2:" + userNameReplaceTwo);

string [] userNameSplit = userName.Split('\b');
if( userNameSplit.Length ==0 )
Console.WriteLine("替换方法3:" + userNameSplit[0]);
else
Console.WriteLine("替换方法3:" + userNameSplit[0] + @"\b" + userNameSplit[1]);


Console.Read();
}
}



jianshao810 2009-06-13
  • 打赏
  • 举报
回复
要么前面加个@"admin\billy"; ,要么"admin\\billy"用双反斜杠
compleat 2009-06-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zgke 的回复:]
string userName = @"admin\billy";
[/Quote]
.
让爱延续 2009-06-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhensoft163 的回复:]
要么前面加个@"admin\billy"; ,要么"admin\\billy"用双反斜杠
[/Quote]



给分吧 可用诶!
hpinger 2009-06-13
  • 打赏
  • 举报
回复
sessionUserName = EscCharClear(sessionUserName);
hpinger 2009-06-13
  • 打赏
  • 举报
回复
比较笨的方法,但适用
public static string EscCharClear(string str)
{
char[] chr = str.ToCharArray();
for(int i=0;i<chr.Length;i++)
{
str = chr[i] == '\n' ? str.Replace(Convert.ToString(chr[i]), @"\n") : str;
str = chr[i] == '\r' ? str.Replace(Convert.ToString(chr[i]), @"\r") : str;
str = chr[i] == '\b' ? str.Replace(Convert.ToString(chr[i]), @"\b") : str;
str = chr[i] == '\f' ? str.Replace(Convert.ToString(chr[i]), @"\f") : str;
str = chr[i] == '\0' ? str.Replace(Convert.ToString(chr[i]), @"\0") : str;
str = chr[i] == '\"' ? str.Replace(Convert.ToString(chr[i]), @"\''") : str;
str = chr[i] == '\'' ? str.Replace(Convert.ToString(chr[i]), @"\'") : str;
str = chr[i] == '\\' ? str.Replace(Convert.ToString(chr[i]), @"\\") : str;
str = chr[i] == '\v' ? str.Replace(Convert.ToString(chr[i]), @"\v") : str;
str = chr[i] == '\t' ? str.Replace(Convert.ToString(chr[i]), @"\t") : str;
str = chr[i] == '\a' ? str.Replace(Convert.ToString(chr[i]), @"\a") : str;
}
return str;
}
evaa006 2009-06-13
  • 打赏
  • 举报
回复
达人都在,顶。。。
iamseakingii 2009-06-13
  • 打赏
  • 举报
回复
通用的话可以参考下面这个扩展方法. String.Escape是我从 Regex.Escape 里复制出来的代码.Regex.Escape只处理了几个转义符,没有处理"\b".
我添加对"\b"的处理.如果还有要处理的转义符,可以对这个String.Escpae方法进行处理(注意数组_category也要做相对的改动)







using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

public class MyClass
{
public static void Main()
{



//session模拟
string sessionUserName = "admin\b\n\f\t\rilly";
string userName = sessionUserName;

//替换
string userNameReplaceFive = userName.Escape();
Console.WriteLine("替换方法5:" + userNameReplaceFive);



Console.Read();
}




}



public static class StringExtension
{

private static readonly byte [] _category ;

static StringExtension()
{
_category = new byte[] {
0, 0, 0, 0, 0, 0, 0, 0, 2/*这是\b的ascii位置.原来是0*/, 2, 2, 0, 2, 2, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2, 0, 0, 3, 4, 0, 0, 0, 4, 4, 5, 5, 0, 0, 4, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 4, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 4, 0, 0, 0
};

}

internal static bool IsMetachar(char ch)
{

bool ok= ((ch <= '|') && (_category[ch] >= 1));
return ok;
}



public static string Escape(this string input)
{
if( string.IsNullOrEmpty(input))
{
return input;
}



for (int i = 0; i < input.Length; i++)
{
if (!IsMetachar(input[i]))
{
continue;
}
StringBuilder builder = new StringBuilder();
char ch = input[i];
builder.Append(input, 0, i);
do
{
builder.Append('\\');
switch (ch)
{
case '\t':
ch = 't';
break;

case '\n':
ch = 'n';
break;

case '\f':
ch = 'f';
break;

case '\r':
ch = 'r';
break;

case '\b':
ch = 'b';
break;
}
builder.Append(ch);
i++;
int startIndex = i;
while (i < input.Length)
{
ch = input[i];
if (IsMetachar(ch))
{
break;
}
i++;
}
builder.Append(input, startIndex, i - startIndex);
}
while (i < input.Length);
return builder.ToString();
}
return input;



}
}




飛雪傳奇 2009-06-13
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 iamseakingii 的回复:]
用正则表达式很简单


C# code


using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

public class MyClass
{
public static void Main()
{
//session模拟
//Sesion["username"] = "admin\billy";
//string userName = Session["username"];
string sessionUserName = "admin\billy";
string us…
[/Quote]

牛人,我又涨知识了
hpinger 2009-06-13
  • 打赏
  • 举报
回复
我觉得问题没有从根本上解决,你这次替换的是\b,下一次换成“admin\cilly了”呢?
因此,我认为应该做成一个通用的方法,让我想想……
kafanOday 2009-06-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Rainsome 的回复:]
引用 3 楼 zhensoft163 的回复:
要么前面加个@"admin\billy"; ,要么"admin\\billy"用双反斜杠
.
[/Quote]


没错的
anwsp 2009-06-11
  • 打赏
  • 举报
回复
要么前面加个@"admin\billy"; ,要么"admin\\billy"用双反斜杠
TriSinker 2009-06-11
  • 打赏
  • 举报
回复
string x="admin\billy";
x = x.Replace("\b", "\\b");
龙宜坡 2009-06-11
  • 打赏
  • 举报
回复
@
加载更多回复(25)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧