我想在';'之间得到文字字符。但是,如果有3个匹配,我希望得到';'之间的文本当前光标位置的字符。我正在使用多文本框。
实施例
select * from database;
----> **Lets say my cursor is here**
select
orders from
customer;
select * from employees;
所以,我只想获得'从客户选择订单'文字。
你能否分享一下你的想法?
答案 0 :(得分:0)
要实现这一点,首先必须找到;
的所有标记。为此,请遍历所有指标(source):
private List<int> AllIndicesOf(string strToSearch, string fullText)
{
List<int> foundIndices = new List<int>();
for (int i = fullText.IndexOf(strToSearch); i > -1; i = fullText.IndexOf(strToSearch, i + 1))
{
foundIndices.Add(i + 1);
}
return foundIndices;
}
然后你必须将你的位置与那些指数进行比较,因为你只需要光标后面的索引(;
):
List<int> indicies = AllIndicesOf(";", txtBxText.Text);
try
{
if (indicies.Count > 0)
{
int cursorPos = txtBxText.SelectionStart;
var indicesBefore = indicies.Where(x => x < cursorPos);
int beginIndex = indicesBefore.Count() > 0 ? indicesBefore.Last() : 0;
int endIndex = indicies.Where(x => x > beginIndex).First();
txtBxSelected.Text = txtBxText.Text.Substring(beginIndex, endIndex - beginIndex);
}
}
catch { }
如果您的游标位置在所有其他索引之后,try-catch
语句用于阻止Exception
。
示例项目可以是downloaded here。
答案 1 :(得分:0)
此解决方案完美有效,但您需要再次检查并考虑一些可能的例外情况。我自己并不认为,因为我认为最好由你来处理。我还使用了richTextBox
,它比多行文本框更好。 享受代码兄弟
private void button1_Click(object sender, EventArgs e)
{
var ultimateResult = string.Empty;
var cusrPosition = richTextBox1.SelectionStart;
var currentStr = string.Empty;
var strDic = new Dictionary<string,int>();
var textArr = richTextBox1.Text.ToCharArray();
for (var i = 0; i < textArr.Count(); i++)
{
if (textArr[i] != ';')
currentStr = currentStr + textArr[i];
else
{
strDic.Add(currentStr,i);
currentStr = string.Empty;
}
}
ultimateResult = strDic.First(item => item.Value >= cusrPosition).Key;
textBox1.Text = ultimateResult;
}