如何解决无法识别的转义序列?

时间:2018-04-11 11:47:19

标签: c#

我有这个代码来获取字符串:

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

2 个答案:

答案 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方法