Member 10410972 Ответов: 3

Извлечь текст из listbox1 после определенного текста ?


Hello everyone,
This below is a code that extracts everything from listBox1 after "sometext" in textBox1.text, and it works well.

private void extract()
        {
            string s = string.Join(Environment.NewLine, listBox1.SelectedItems.OfType<object>().Select(i => Regex.Match(i.ToString(), @"sametext?(.*?)(?=#|$)").Groups[1].Value));
            textBox1.Text = (s.ToString());
        }

"sometext" is not always the same.


I would like to replace "sametext" with textBox2.text

textBox2.Text = different text

I tried:


Что я уже пробовал:

private void extract()
        {
            string s = string.Join(Environment.NewLine, listBox1.SelectedItems.OfType<object>().Select(i => Regex.Match(i.ToString(), "@"+ textBox2.Text + "?(.*?)(?=#|$)").Groups[1].Value));
            textBox1.Text = (s.ToString());
        }

But it does not work.

Please help me.

Thank you.

3 Ответов

Рейтинг:
17

Patrice T

В C#" "и @ "" - это 2 разных типа строк: подробнее см. документацию.
Ваша проблема заключается в том, что " @ " не является частью строки.

// This
@"sametext?(.*?)(?=#|$)"
// do not translate to this
"@"+ textBox2.Text + "?(.*?)(?=#|$)"
// but to this
textBox2.Text + @"?(.*?)(?=#|$)"


Member 10410972

Благодаря ppolymorphe, проблема решена.

Рейтинг:
1

Gerry Schmitz

Поместите свой "шаблон" в отдельную строку (прежде чем использовать его в "матче"), покажите его и понаблюдайте, "почему" это не то, что вы ожидаете.

Вы делаете много предположений о том, какое текстовое поле содержит то, что и т. д. когда у вас нет "доказательств".


Member 10410972

Спасибо, Джерри, но я не знаю, как это сделать...

Рейтинг:
1

Richard Deeming

Предполагая, что вы не хотите, чтобы пользователь вводил регулярное выражение, вам нужно будет "экранировать" введенный им текст.

Вы также захотите ограничить свой поиск элементами, которые действительно соответствуют указанному тексту.

Я также предположил, что вы хотите сопоставить буквальный вопросительный знак после введенного текста, а не делать последний символ введенного текста необязательным.

string pattern = Regex.Escape(textBox2.Text) + @"\?(.*?)(?=\#|$)";

var matchingItems = listBox1.SelectedItems.OfType<object>()
    .Select(i => i.ToString())
    .Select(s => Regex.Match(s, pattern))
    .Where(m => m.Success)
    .Select(m => m.Groups[1].Value);

textBox1.Text = string.Join(Environment.NewLine, matchingItems);

NB: Вы должны сделать себе одолжение и перестать принимать имена Visual Studio по умолчанию для всего. Дайте вашим элементам управления значимые имена - вы поблагодарите себя через шесть месяцев, когда вернетесь, чтобы отредактировать свой код, и вам не придется тратить годы на разработку того, что каждый элемент управления должен представлять! :)