原代码:
执行效果:
/// <summary>
/// 找出程序中的字符串,把它们组成一个列表。
/// </summary>
/// <param name="sText"></param>
/// <returns></returns>
/// 创建时间: 2022-09-03 最后一次修改时间:2022-09-03
public static StringList_ _Syntax_C_StringValue_List(this String sText)
{
DList_<Pair_<int, int>> dl = _Syntax_C_StringValue_Pos(sText);
StringList_ slResult = new StringList_();
foreach (Pair_<int, int> d in dl)
{
slResult.Add(sText.Substring(d.First+1, d.Second-2)); //不要双引号
}
return slResult;
}
/// <summary>
/// 记录代码段中的字符串的位置和长度
/// </summary>
/// <param name="sText"></param>
/// <returns></returns>
/// 创建时间: 2022-09-03 最后一次修改时间:2022-09-03
public static DList_<Pair_<int,int>> _Syntax_C_StringValue_Pos(this string sText)
{
//string s = "\"\n\"";
string sReplace = sText._Syntax_C_Replace_ExplanatoryNote(); //注释用空格代替
DList_<Pair_<int, int>> dResult = new DList_<Pair_<int, int>>();
int nPos = sReplace.IndexOf("\"", 0);
while(nPos != -1)
{
if (nPos - 1 >= 0 && nPos - 1 < sText.Length) //看看双引号前面一个字符是不是 \,如果是则不是字符串标记
{
if (sReplace[nPos - 1] != '\\')
{
int nLeft = nPos;
int nRight = sReplace.IndexOf("\"", nPos + 1); //找下一个标记
while (nRight != -1)
{
if (nRight - 1 >= 0 && nRight - 1 < sText.Length) //看看双引号前面一个字符是不是 \,如果是则不是字符串标记
{
if (sReplace[nRight - 1] != '\\')
{
int nEnd = sReplace.IndexOf("\n", nPos + 1);
if (nRight < nEnd) //下一个标记在同一行内
{
dResult.Add(new Pair_<int, int>(nLeft, nRight - nPos + 1));
nPos = nRight;
break;
}
}
}
else
{
return dResult;
}
nRight = sReplace.IndexOf("\"", nRight + 1); //找下一个标记
}
}
}
nPos = sReplace.IndexOf("\"", nPos + 1);
}
return dResult;
}