我有问题一起使用rtb和regex。
我有vK-lKs-812349;jra_6993788428;Enx-2674@62
我的功能将通过deli'ter'分割数据;'并使用正则表达式匹配每个部分
"^[a-zA-Z]{2}-[a-zA-Z]{3}-[0-9]{7}$"
"^[a-zA-Z]{3}_[0-9]{10}$"
"^[a-zA-Z]{3}-[0-9&~%@*^<>!#$]{7}$"
我想要的是我在rtb中将这些数据排成一行(所有行都有类似的数据,即相同的数据模式)。当我单击一个按钮时,函数应该得到光标所在的行,它应该与模式匹配,如果正则表达式不匹配,它应该改变文本特定部分的颜色。
示例:如果我在第2行并且第2部分数据是'zza 6993788428'那么因为_缺少正则表达式将不匹配所以我希望这部分在rtb应该得到红色。
我们将不胜感激。感谢...
答案 0 :(得分:1)
试试这个
if (!string.IsNullOrEmpty(richTextBox1.Text))
{
int lineStart = 0;
foreach (string item in richTextBox1.Lines)
{
List<string> lst = item.Split(new char[] { ';' }).ToList();
if (lst.Count == 3)
{
if (!Regex.IsMatch(lst[1], "^[a-zA-Z]{3}_[0-9]{10}$"))
{
int Start = richTextBox1.Find(item, lineStart, richTextBox1.TextLength, RichTextBoxFinds.WholeWord);
int End = Start + item.Length;
richTextBox1.Select(Start, End);
richTextBox1.SelectionBackColor = Color.Red;
}
else
{
int Start = richTextBox1.Find(item, lineStart, richTextBox1.TextLength, RichTextBoxFinds.WholeWord);
int End = Start + item.Length;
richTextBox1.Select(Start, End);
richTextBox1.SelectionBackColor = Color.Green;
}
}
lineStart += item.Length;
}
}
答案 1 :(得分:1)
我自己找到了这个问题的代码。我创建了一个计时器,它从rtb获取行号并放入一个全局变量。
timer1.Start();
timer1.Tick += new EventHandler(LineEvent);
并且全局变量和事件是
public static class foo
{
public static int lineno;
}
private void LineEvent(object sender, EventArgs eArgs)
{
int IndexCoun = rtb1.SelectionStart;//Index count where actually the mouse is clicked in the richtextbox
foo.lineno = rtb1.GetLineFromCharIndex(IndexCoun);//Get the line no
}
与函数匹配并更改rtb的主要功能是
private void RegexCla(string value, string pattern, string data)
{
if(Regex.IsMatch(value, pattern) == true)
{
int index = 0;
for (int i = 0; i < foo.lineno; i++)
{
int gelen = rtb1.Lines[i].Length;
index = index + gelen;
}
rtb1.Find(data, index, RichTextBoxFinds.WholeWord);
rtb1.SelectionColor = Color.Green;
rtb1.SelectedText = value;
}
else
{
int index = 0;
for (int i = 0; i < foo.lineno; i++)
{
int gelen = rtb1.Lines[i].Length;
index = index + gelen;
}
rtb1.Find(data, index, RichTextBoxFinds.WholeWord);
rtb1.SelectionColor = Color.Red;
}
}
最后按下按钮是
private void RegBtn_Click(object sender, EventArgs e)
{
string[] rtblines = rtb1.Lines;
var reqtext = rtblines[foo.lineno];
string[] reclis = reqtext.Split(';');
RegexCla(reclis[0].Replace(" ", ""), "^[a-zA-Z]{2}-[a-zA-Z]{3}-[0-9]{7}$", reclis[0]);
}
感谢您对@King的所有支持。
答案 2 :(得分:1)
private void Findword(string FindText, RichTextBox rt)
{
try
{
List<int> lst = new List<int>();
bool IsRun = true;
int Index = 0;
int count =0;
lst.Add(-1);
lst.Add(0);
lst.Add(rt.TextLength);
while (IsRun)
{
Index = rt.Find(FindText, Index, RichTextBoxFinds.WholeWord);
if (lst.Contains(Index))
break;
else
count++;
lst.Add(Index);
Index += FindText.Length;
}
MessageBox.Show(FindText + " Count: " + count);
}
catch { }
}