Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 08.02.2014
Сообщений: 57
1

Работа с регулярными выражениями - проверка окончаний слов

08.04.2015, 01:38. Просмотров 846. Ответов 2
Метки нет (Все метки)


Есть Паттерн:
C
1
private static string AdjectivePattern = "(ее|ие|ые|ое|ими|ыми|ей|ий|ый|ой|ем|им|ым|ом|его|ого|ему|ому|их|ых|ую|юю|ая|яя|ою|ею)?";
Есть строковая переменная rv, которая содержит кусок слова, к примеру там лежит "ютнее".

В процессе выполняется следующий код:
C#
1
2
rgx = new Regex(AdjectivePattern);
temp = rgx.Replace(rv, "", 1);
Если я правильно понимаю, окончание "ее" должно удалиться из rv, соответственно, в temp должно лежать "ютн", однако, там лежит "ютнее".

Прошу подсказать в чем дело, заранее благодарен.

Если совсем надо, весь код:
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
 
namespace trymatrixes
{
    class Stammer
    {
        private static string PerfectiveGerundPattern = "((ив|ивши|ившись|ыв|ывши|ывшись)|((?<=ая)(в|вши|вшись)))$";
        private static string ReflexivePattern = "(с[яь])?";
        private static string AdjectivePattern = "(ее|ие|ые|ое|ими|ыми|ей|ий|ый|ой|ем|им|ым|ом|его|ого|ему|ому|их|ых|ую|юю|ая|яя|ою|ею)?";
        private static string ParticiplePattern = "((ивш|ывш|ующ)|((?<=ая)(ем|нн|вш|ющ|щ))$";
        private static string VerbPattern = "((ила|ыла|ена|ейте|уйте|ите|или|ыли|ей|уй|ил|ыл|им|ым|ен|ило|ыло|ено|ят|ует|уют|ит|ыт|ены|ить|ыть|ишь|ую|ю)|((?<=[ая])(ла|на|ете|йте|ли|й|л|ем|н|ло|но|ет|ют|ны|ть|ешь|нно)))$";
        private static string NounPattern = "(а|ев|ов|ие|ье|е|иями|ями|ами|еи|ии|и|ией|ей|ой|ий|й|иям|ям|ием|ем|ам|ом|о|у|ах|иях|ях|ы|ь|ию|ью|ю|ия|ья|я)$";
        private static string RvrePattern = "^(.*?[аеиоуыэюя])(.*)$";
        private static string DerivationalPattern = ".*[^аеиоуыэюя]+[аеиоуыэюя].*ость?$";
        private static string DerPattern = "ость?$";
        private static string SuperlativePattern = "(ейше|ейш)$";
        private static string IPattern = "и$";
        private static string PPattern = "ь$";
        private static string NNPattern = "нн$";
 
        public string stem(string word)
        {
            word = word.ToLower();
            word = word.Replace('ё','е');
            Match m = Regex.Match(word, RvrePattern);
            if (m.Success)
            { 
                String pre = m.Groups[1].Value;
                String rv = m.Groups[2].Value;
                Regex rgx = new Regex(PerfectiveGerundPattern);
                string temp = rgx.Replace(rv, "", 1);
                if (temp.Equals(rv))
                {
                    rgx = new Regex(ReflexivePattern);
                    rv = rgx.Replace(rv, "", 1);
                    rgx = new Regex(AdjectivePattern);
                    temp = rgx.Replace(rv, "", 1);
                    if (!temp.Equals(rv))
                    {
                        rv = temp;
                        rgx = new Regex(ParticiplePattern);
                        rv = rgx.Replace(rv, "", 1);
                    }
                    else
                    {
                        rgx = new Regex(VerbPattern);
                        temp = rgx.Replace(rv, "", 1);
                        if (temp.Equals(rv))
                        {
                            rgx = new Regex(NounPattern);
                            rv = rgx.Replace(rv, "", 1);
                        }
                        else
                        {
                            rv = temp;
                        }
                    }
                }
                else
                {
                    rv = temp;
                }
                rgx = new Regex(IPattern);
                rv = rgx.Replace(rv, "", 1);
 
                if (Regex.Match(rv, DerivationalPattern).Success)
                {
                    rgx = new Regex(DerPattern);
                    rv = rgx.Replace(rv, "", 1);
                }
 
                rgx = new Regex(PPattern);
                temp = rgx.Replace(rv, "", 1);
                if (temp.Equals(rv))
                {
                    rgx = new Regex(SuperlativePattern);
                    rv = rgx.Replace(rv, "", 1);
                    rgx = new Regex(NNPattern);
                    rv = rgx.Replace(rv, "н", 1);
                }
                else
                {
                    rv = temp;
                }
                word = pre + rv;
 
            }
            return word;
        }
    }
}


Добавлено через 26 минут
C#
1
Match a = Regex.Match(temp, AdjectivePattern);
a.Success выдает true, то есть косяк именно в реплейсе по идее.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.04.2015, 01:38
Ответы с готовыми решениями:

Проверка email на валидность регулярными выражениями
Есть задача: проверить вводимый email на валидность. Можно сделать это ручками, а можно через...

Описать множества слов, задаваемые регулярными выражениями
Опишите множества слов, задаваемыми следующими регулярными выражениями а(а+b)*a Заранее...

Работа с регулярными выражениями
Привет всем. Имеются куча сотен ссылок с таким шаблоном ...

Работа с регулярными выражениями для арифметических выражений
Вот задание: Дана строка, содержащая текст и арифметические выражения вида a ® b, где ® — один из...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
Записывайтесь на профессиональные курсы С#-разработчиков‌
2
Master of Orion
Эксперт .NET
6079 / 4935 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
08.04.2015, 03:43 2
Staple Stable,
1) Вместо своего new regex Пользуйтесь статическим Regex. Плюсы в кэше неплохие.
2) попробуйте написать
C#
1
2
var pattern = @"((ее)|(ие)|(ые)...)";
var result = Regex.Replace(word, pattern, string.Empty);
Добавлено через 55 секунд
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
                if (temp.Equals(rv))
                {
                    rgx = new Regex(ReflexivePattern);
                    rv = rgx.Replace(rv, "", 1);
                    rgx = new Regex(AdjectivePattern);
                    temp = rgx.Replace(rv, "", 1);
                    if (!temp.Equals(rv))
                    {
                        rv = temp;
                        rgx = new Regex(ParticiplePattern);
                        rv = rgx.Replace(rv, "", 1);
                    }
                    else
                    {
                        rgx = new Regex(VerbPattern);
                        temp = rgx.Replace(rv, "", 1);
                        if (temp.Equals(rv))
                        {
                            rgx = new Regex(NounPattern);
                            rv = rgx.Replace(rv, "", 1);
                        }
                        else
                        {
                            rv = temp;
                        }
                    }
                }
фигня написана
0
0 / 0 / 0
Регистрация: 08.02.2014
Сообщений: 57
08.04.2015, 08:45  [ТС] 3
Боже, отлично, спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.04.2015, 08:45

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Проверка текста регулярными выражениями
Как реализовать проверку текста используя регулярные выражения? Для проверки например, того же email

Проверка на наличие подстроки регулярными выражениями
Здравствуйте. С помощью регулярных выражений я пытаюсь проверить наличие подстроки. Для этого пишу...

Работа с регулярными выражениями С++
Опишите функцию анализа номера, обработайте ошибку указания номера у недопустимом формате...

Работа с регулярными выражениями
Мне нужно получить из страницы определенные куски текста. т.е. надо найти такой кусок &lt;TR...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.