我有这个代码来获取字符串:
public static string getBetween(string strSource, string strStart, string strEnd)
{
int Start, End;
if (strSource.Contains(strStart) && strSource.Contains(strEnd))
{
Start = strSource.IndexOf(strStart, 0) + strStart.Length;
End = strSource.IndexOf(strEnd, Start);
return strSource.Substring(Start, End - Start);
}
else
{
return "";
}
}
这是我的字符串数据:
FHTT-04ce1068 GP \ U0001 \ u001b10001182-2100113j6J2-FTTH \ B \ u0006δλ0 - ?\ u0006
我希望在该数据中找到子字符串,为此目的写下这段代码:
string userName = getBetween(theData,"GP\u0001\u001", "\b\u0006??0?");
但得到此错误:
无法识别的转义序列
将该代码更改为:
string userName = getBetween(theData,@"GP\u0001\u001", "\b\u0006??0?");
但是@
为搜索字符串添加了双重转义,并且该代码无法正常工作,我该如何解决该问题?
我在此链接中的来源:
Main Source
答案 0 :(得分:2)
您需要对两个字符串使用verbatim identifier (@
)符号。
使用字符串文字,它基本上意味着\
字符被视为字符串的一部分,与非逐字字符串文字相对应,它用作转义字符。 (请注意,在逐字字面值字符串中,如果要将"
字符串作为字符串的一部分包含在内,则可以通过加倍来转义它 - var s = @"this is my ""special"" string";
)
你的getBetween方法没有返回预期值的原因是方法本身有错误。
在你的getBetween方法中你有一些冗余代码,所以这里有一个改进的版本:
public static string GetBetween(string strSource, string strStart, string strEnd)
{
var Start = strSource.IndexOf(strStart) + strStart.Length;
var End = strSource.IndexOf(strEnd, Start);
if (Start > strStart.Length -1 && End > -1)
{
return strSource.Substring(Start, End - Start);
}
return "";
}
用法:
var source = @"FHTT-04ce1068 GP\u0001\u001b10001182-2100113j6J2-FTTH\b\u0006??0?-\u0006";
var target = GetBetween(source, @"GP\u0001\u001", @"\b\u0006??0?");
结果:
b10001182-2100113j6J2-FTTH
You can see a live demo on rextester.
以下是我从原始方法中改进的内容:
// Capitalize the method name according to c# naming conventions.
public static string getBetween(string strSource, string strStart, string strEnd)
{
int Start, End;
// no point of checking if the string contains the values, IndexOf will return -1 if it doesn't.
if (strSource.Contains(strStart) && strSource.Contains(strEnd))
{
// You don't need to specify that 0, IndexOf other overload already starts from zero.
Start = strSource.IndexOf(strStart, 0) + strStart.Length;
End = strSource.IndexOf(strEnd, Start);
return strSource.Substring(Start, End - Start);
}
// else is redundant since there is a return statement in the if.
else
{
return "";
}
}
问题是你搜索的字符串已经填满了转义序列,包括几个\"
- 因此在该字符串中添加逐字标识符实际上会导致编译错误。
另一方面,如果你不在搜索字符串上使用逐字文字,你就不能在其他字符串上使用它 - 这可能会导致问题 - 因为它意味着另一个字符串不能只是原始字符串的随机部分 - 它们必须使转义序列正确 - 而"GP\u0001\u001"
不能 - 最后一个转义序列缺少它的最后一个字符 - {{1你得到的结果实际上是b
的一部分 - 所以如果你像这样进行搜索:
\u0001b
你会得到这个结果:
var source = "\0PV?-M\0$??E?\b\0E\0\u0003???\0\0\u001d\u0011?)????\n\n\u0005g?H\a\u0015\u0003???\u0004s\u0003?S]pfX?\a?????H???U\u0006\0\0\u0001,.\u0006\0\u0011S?(\u0006\0\0\0\u00037\u0006Z???=\u0006\0\0\0%\u001a\u001e\0\0\0\t\u0001\u0018pppoe-session-id=39703\u001a)\0\0\0\t\u0001#client-mac-address=f08c.fbce.07fb\u001a=\0\0\r?\u000170 0/0/0:1250.1059 AN5516-01/3/6/2/0/3/FHTT04ce07f8 GP\u001aL\0\0\0\t\u0001Fcircuit-id-tag=0 0/0/0:1250.1059 AN5516-01/3/6/2/0/3/FHTT04ce07f8 GP,\n0019a97b\u0005\u0006\u0001\b?'W80 0/0/0:1250.1059 AN5516-01/3/6/2/0/3/FHTT04ce07f8 GP.\u001a>\0\0\0\t\u000280 0/0/0:1250.1059 AN5516-01/3/6/2/0/3/FHTT04ce07f8 GP.\u001e70 0/0/0:1250.1059 AN5516-01/3/6/2/0/3/FHTT04ce07f8 GP\u0001\u001b10001084-2100101Db75-FTTH\b\u0006??0?-\u0006\0\0\0\u0001\u001a\u0016\0\0\0\t\u0001\u0010vrf-id=default\u001a\u001f\0\0\0\t\u0001\u0019accounting-list=ibs-isg\a\u0006\0\0\0\u0001\u0006\u0006\0\0\0\u0002?\u0006\0\0\0C\u001a\"\0\0\0\t\u0001\u001cconnect-progress=IPCP Open*\u0006\u001c???4\u0006\0\0\0\u0001/\u0006\u0001Yb?+\u0006?kTJ5\u0006\0\0\0\b0\u0006\u0001???\u001a)\0\0\0\t\u0001#acct-input-octets-ipv4=4092795251\u001a(\0\0\0\t\u0001\"acct-input-packets-ipv4=22540221\u001a*\0\0\0\t\u0001$acct-output-octets-ipv4=1916952698\u001a$\0\0\0\t\u0001\u001eacct-output-gigawords-ipv4=8\u001a)\0\0\0\t\u0001#acct-output-packets-ipv4=28406963\u001a \0\0\0\t\u0001\u001aacct-input-octets-ipv6=0\u001a!\0\0\0\t\u0001\u001bacct-input-packets-ipv6=0\u001a!\0\0\0\t\u0001\u001bacct-output-octets-ipv6=0\u001a\"\0\0\0\t\u0001\u001cacct-output-packets-ipv6=0 \u0005ASR\u0004\u0006????_\u0012\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0)\u0006\0\0\0\0";
var target = GetBetween(
source,
"GP\u0001\u001b", // Note I've added that `b`!
"\b\u0006??0?");
答案 1 :(得分:0)
您必须使用\\
代替\
或使用@
两个参数getBetween
方法