上面 _delete 是一体的,但_IndexOfWord 把它变成 _ delete
是因为加入了
public static bool
_IsProgramOperationalCharacter(this char ch) => "+-*/%|<>=".IndexOf(ch) != -1;
/// <summary>
/// 从某个位置开始查找一个单词,这个单司是第一次出现,找到即返回,区分大小写。
/// </summary>
/// <param name="sText"></param>
/// <param name="sWord"></param>
/// <param name="nFindStart"></param>
/// <returns></returns>
/// 创建时间: 2022-08-08 最后一次修改时间:2022-09-18
public static int _IndexOfWord(this string sText, string sWord, int nFindStart = 0)
{
if(sWord.Length == 0) return -1 ; // 不加上这名,_IndexWord("") 会进入死循环
if (nFindStart <= 0) nFindStart = 0;
if (sText.Length - nFindStart < sWord.Length ) return -1;
int nPos = sText.IndexOf(sWord, nFindStart);
while (nPos != -1)
{
bool bPrev = false;
bool bNext = false;
int nPrev = nPos - 1;
int nNext = nPos + sWord.Length;
if (nPrev > 0)
{
char chPrev = sText[nPrev];
if (chPrev._IsPunctuation() || chPrev._IsUnPrintable() || chPrev._IsControl() || chPrev._IsWhiteSpace() || chPrev._IsSeparator() ||
chPrev._IsProgramOperationalCharacter())
{
bPrev = true;
}
}
else
{
bPrev = true;
}
if(nNext > 0 && nNext < sText.Length)
{
char chNext = sText[nNext];
if (chNext._IsPunctuation() || chNext._IsUnPrintable() || chNext._IsControl() || chNext._IsWhiteSpace() || chNext._IsSeparator() ||
chNext._IsProgramOperationalCharacter())
{
bNext = true;
}
}
else
{
bNext = true;
}
if (bNext && bPrev) return nPos; //正确,是单词
//不正确,继续查找
nPos = sText.IndexOf(sWord, nPos + sWord.Length);
}
return nPos;
}