我正在尝试使用SendKeys.Send()
发送“ {”和“}”
我已经尝试使用string.Replace{"{", "{{}"}
txt = txt.Replace("{", "{{}");
txt = txt.Replace("}", "{}}");
SendKeys.Send(txt);
我希望它发送“ {”和“}”,但是程序抛出错误
System.FormatException
答案 0 :(得分:3)
以下是相关位:
加号(+),脱字号(^),百分号(%),代字号(〜)和 括号()对SendKeys具有特殊含义。指定以下一项 这些字符,将其括在大括号({})中。例如, 指定加号,使用“ {+}”。 要指定大括号字符,请使用 “ {{}”和“ {}}” 。方括号([])对SendKeys没有特殊含义, 但是您必须将它们用大括号括起来。
解决方案的问题是您要进行2次单独的替换。
采用输入字符串“ {”。
txt = txt.Replace("{", "{{}"); // input becomes "{{}"
txt = txt.Replace("}", "{}}"); // input becomes "{{{}}"
SendKeys.Send(txt); // error!
我敢肯定,有比这更优雅的解决方案,但是您可以尝试以下方法:
var sb = new StringBuilder(txt.Length);
for(var i = 0; i < txt.Length; i++)
{
var c = txt[i];
switch (c)
{
case '+':
case '^':
case '%':
case '~':
case '(':
case ')':
case '{':
case '}':
sb.Append('{');
sb.Append(c);
sb.Append('}');
break;
default:
sb.Append(c);
break;
}
}
SendKeys.Send(sb.ToString());
编辑通过开关和for扩展了转义,以说明其他可转义的字符。
答案 1 :(得分:1)
就像其他人指出的那样,您的第二个Replace
将替换您的第一个Replace
添加的花括号。
要转义字符串中的花括号,可以使用Regex
,如下所示:
SendKeys.Send(Regex.Replace(txt, @"[/{/}]", m => string.Format("{{{0}}}", m.Value)));
或者甚至更好地转义所有在此上下文中具有特殊含义的字符,即。 Regex.Replace(txt, @"[/{/}/+/%/~/(/)]", m => string.Format("{{{0}}}", m.Value))
另一种完全不同的选择是一次发送一个字符,并在必要时转义大括号:
"some{}text".ToCharArray().ToList()
.ForEach(a=> SendKeys.Send(a == '}' || a == '{' ? "{"+a+"}": a.ToString()));
答案 2 :(得分:1)
我会使用其他变量来保存整个字符串:
root@a35defb4cad9:/opt/spark/dist# python --version
Python 2.7.6
答案 3 :(得分:-1)
{
必须由{{}
转义。 }
必须被{}}
转义。企图逃脱...
// NON-WORKING EXAMPLE!
txt = txt.Replace("{", "{{}");
txt = txt.Replace("}", "{}}");
...有问题,第一次替换引入的右括号再次被第二次替换掉。因此,从{
开始,您会得到
{ --> {{} --> {{{}}
这是错误的。为避免转义括号完全逃脱,请在第一个“替换”中为闭合的逃生括号使用替代字符。例如。一些中文字符閉
,假设您永远不想发送此字符。
txt = txt.Replace("{", "{{閉");
txt = txt.Replace("}", "{}}");
// After having done the escape, replace the surrogate by the closing brace again.
txt = txt.Replace("閉", "}");
如果不确定是否将永远不会发送单个字符,请使用不太可能的字符序列作为替代,可能来自閉©ξ
(中文,拉丁标点,希腊文)等不同字母。