Всем привет! Нужно, чтобы из строки Regex создал коллекцию слов (то есть вытащил каждое слово и поместил его в отдельную ячейку контейнера MatchCollection методом Matches). Это я сделал. Нужно чтобы вытаскивание слов было таким, чтобы все слова в контейнер приходили с маленькой буквы, все буквы в слове маленькие. "Всем привет всем" А то получается, что одно и то же слово всем считается как 2 разных, так как один раз с маленькой написано, второй раз с большой. Как показать, чтобы парсинг производился без учёта регистра. RegexOptions.IgnoreCase не помогает, так как он делает приём как больших так и маленьких букв, не изменяя их, а мне надо чтобы при вытаскивании из строки все буквы в слове стали маленькими. Спасибо за ответы!
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Text.RegularExpressions;
namespace Телефоны { class Program { static void Main(string[] args) { List Words = new List(); List Repeat = new List(); Console.WriteLine("Введите текст"); string str = Console.ReadLine(); Regex pat = new Regex(@"([a-zA-ZА-Яа-я]) +"); MatchCollection matches = pat.Matches(str); foreach (Match m in matches) { Words.Add(Convert.ToString(m.Groups[0])); } foreach (string s in Words) { int t = 0; foreach (string e in Repeat) { if (s == e) t++; } if (t > 0) continue; int sum = 0; foreach (string ss in Words) { if (s == ss) sum++; } Console.WriteLine("Слово {0} в тексте встречается {1} раз", s, sum); Repeat.Add(s); } } } }
Дополнен 6 лет назад
Вот, нашёл модификатор i - не учитывать регистр, куда его вставить не знаю.
Так? Regex pat = new Regex(@"([a-zA-ZА-Яа-я] i)+"); Не получается. Он думает, что это буква и не выдаёт ни одного слова. Regex pat = new Regex(@"([a-zA-ZА-Яа-я] \i)+"); С экраном ошибку выдаёт, не может понять что это.
Николай Веселуха
Высший разум
(360718)
Не очень понятна цель вашего задания, но попробуйте так...
Console.Write("Введите текст: ");
var line = Console.ReadLine();
var pattern = new Regex(@"([a-zA-Zа-яА-Я]) +");
var matches = pattern.Matches(line);
var words = new List();
foreach (var matche in matches) words.Add(matche.ToString().ToLowerInvariant());
foreach (var word in words) Console.WriteLine(word);
Не совсем понятно объясняешь. Какой нужен конечный результат? Ежели тебе нужны слова токмо с маленькой буквы - удали А-Я в регулярном выражении. Модификаторы ставятся пред символом и действуют токмо для него (ежели у тебя списки - ставь их в круглые скобки и пред скобкой ставь модификатор). Свойство IgnoreCase действует на все.
Конечный результат: сколько раз встречается каждое слово в строке не зависимо от регистров букв в слове. Например: Для строки "Привет всей комиссии! А также привет всей аудитории". Программа выведет Слово Привет в тексте встречается 1 раз Слово всей в тексте встречается 2 раз Слово комиссии в тексте встречается 1 раз Слово А в тексте встречается 1 раз Слово также в тексте встречается 1 раз Слово привет в тексте встречается 1 раз Слово аудитории в тексте встречается 1 раз
А должно быть: Слово привет в тексте встречается 2 раз Слово всей в тексте встречается 2 раз Слово комиссии в тексте встречается 1 раз Слово А в тексте встречается 1 раз Слово также в тексте встречается 1 раз Слово аудитории в тексте встречается 1 раз
Роман Protocol
Мыслитель
(8562)
Правильнее должно быть:
Слово привет в тексте встречается 2 раз
Слово всей в тексте встречается 2 раз
Слово комиссии в тексте встречается 1 раз
Слово а в тексте встречается 1 раз
Слово также в тексте встречается 1 раз
Слово аудитории в тексте встречается 1 раз
C# Парсинг слов из строки без регистра Роман Protocol Гуру (3561), Вопрос решён 2 дня назад Всем привет! Нужно, чтобы из строки Regex создал коллекцию слов (то есть вытащил каждое слово и поместил его в отдельную ячейку контейнера MatchCollection методом Matches). Это я сделал. Нужно чтобы вытаскивание слов было таким, чтобы все слова в контейнер приходили с маленькой буквы, все буквы в слове маленькие. "Всем привет всем" А то получается, что одно и то же слово всем считается как 2 разных, так как один раз с маленькой написано, второй раз с большой. Как показать, чтобы парсинг производился без учёта регистра. RegexOptions.IgnoreCase не помогает, так как он делает приём как больших так и маленьких букв, не изменяя их, а мне надо чтобы при вытаскивании из строки все буквы в слове стали маленькими. Спасибо за ответы!
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Text.RegularExpressions;
namespace Телефоны { class Program { static void Main(string[] args) { List Words = new List(); List Repeat = new List(); Console.WriteLine("Введите текст"); string str = Console.ReadLine(); Regex pat = new Regex(@"([a-zA-ZА-Яа-я]) +"); MatchCollection matches = pat.Matches(str); foreach (Match m in matches) { Words.Add(Convert.ToString(m.Groups[0])); } foreach (string s in Words) { int t = 0; foreach (string e in Repeat) { if (s == e) t++; } if (t > 0) continue; int sum = 0; foreach (string ss in Words) { if (s == ss) sum++; } Console.WriteLine("Слово {0} в тексте встречается {1} раз", s, sum); Repeat.Add(s); } } } } Дополнен 3 дня назад Вот, нашёл модификатор i - не учитывать регистр, куда его вставить не знаю.
Дополнен 3 дня назад И поможет ли i? Нравится Подписаться Ответить ЛУЧШИЙ ОТВЕТ Николай Веселуха 3 дня назад Высший разум (193275) i вынести за квадратные скобки в конце 3 Нравится 10 Комментариев Пожаловаться 2 ОТВЕТА Яспис Смарагдович 3 дня назад Мудрец (11060) Не совсем понятно объясняешь. Какой нужен конечный результат? Ежели тебе нужны слова токмо с маленькой буквы - удали А-Я в регулярном выражении. Модификаторы ставятся пред символом и действуют токмо для него (ежели у тебя списки - ставь их в круглые скобки и пред скобкой ставь модификатор). Свойство IgnoreCase действует на все. Нравится 3 Комментария Пожаловаться
Эмиль Ивочкин 2 дня назад Знаток (393) Есть свойство у строк, позволяющее менять регистр, просто примени к строке String.ToLower Нравится Комментировать Пожаловаться
Нужно, чтобы из строки Regex создал коллекцию слов (то есть вытащил каждое слово и поместил его в отдельную ячейку контейнера MatchCollection методом Matches). Это я сделал. Нужно чтобы вытаскивание слов было таким, чтобы все слова в контейнер приходили с маленькой буквы, все буквы в слове маленькие.
"Всем привет всем"
А то получается, что одно и то же слово всем считается как 2 разных, так как один раз с маленькой написано, второй раз с большой. Как показать, чтобы парсинг производился без учёта регистра.
RegexOptions.IgnoreCase не помогает, так как он делает приём как больших так и маленьких букв, не изменяя их, а мне надо чтобы при вытаскивании из строки все буквы в слове стали маленькими.
Спасибо за ответы!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;
namespace Телефоны
{
class Program
{
static void Main(string[] args)
{
List Words = new List();
List Repeat = new List();
Console.WriteLine("Введите текст");
string str = Console.ReadLine();
Regex pat = new Regex(@"([a-zA-ZА-Яа-я]) +");
MatchCollection matches = pat.Matches(str);
foreach (Match m in matches)
{
Words.Add(Convert.ToString(m.Groups[0]));
}
foreach (string s in Words)
{
int t = 0;
foreach (string e in Repeat)
{
if (s == e)
t++;
}
if (t > 0)
continue;
int sum = 0;
foreach (string ss in Words)
{
if (s == ss)
sum++;
}
Console.WriteLine("Слово {0} в тексте встречается {1} раз", s, sum);
Repeat.Add(s);
}
}
}
}