Регулярное выражение: удаление всех символов с конца строки до последнего [a-zA-Z].

TeslaCo

Client
Регистрация
25.10.2016
Сообщения
62
Благодарностей
2
Баллы
8
Здравствуйте, подскажите пожалуйста, как можно удалить все символы (русские, английские буквы, цифры и спец символы) с конца строки до последнего символа который попадётся из диапазона [a-zA-Z].

Пример.
Было: Каминная вытяжка MAUNFELD DREAM 60 ТЕМНОБЕЖЕВОЕ стекло
Стало: Каминная вытяжка
 

baracuda

Client
Регистрация
19.06.2013
Сообщения
793
Благодарностей
278
Баллы
63
С начала -} от а до Я -} все брать
 
  • Спасибо
Реакции: TeslaCo

doc

Client
Регистрация
30.03.2012
Сообщения
8 685
Благодарностей
4 641
Баллы
113
замена
[a-zA-Z].*$
на пустоту
 
  • Спасибо
Реакции: TeslaCo

TeslaCo

Client
Регистрация
25.10.2016
Сообщения
62
Благодарностей
2
Баллы
8

TeslaCo

Client
Регистрация
25.10.2016
Сообщения
62
Благодарностей
2
Баллы
8
замена
[a-zA-Z].*$
на пустоту
А как сделать удаление до последней встречающейся заглавной буквы (справа на лево), за исключением первой буквы в строке?
[А-ЯA-Z].*$ - удаляет всё, потому что первая буква в строке идёт заглавная.

Было: Каминная вытяжка Русь MGB915 БЕЛАЯ
Стало: Каминная вытяжка
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 339
Благодарностей
9 088
Баллы
113
А как сделать удаление до последней встречающейся заглавной буквы (справа на лево), за исключением первой буквы в строке?
[А-ЯA-Z].*$ - удаляет всё, потому что первая буква в строке идёт заглавная.

Было: Каминная вытяжка Русь MGB915 БЕЛАЯ
Стало: Каминная вытяжка
Попробуйте такую: [А-ЯA-Z].*?(?=[А-ЯA-Z]) (первое совпадение)

99424
 
  • Спасибо
Реакции: TeslaCo

TeslaCo

Client
Регистрация
25.10.2016
Сообщения
62
Благодарностей
2
Баллы
8
Попробуйте такую: [А-ЯA-Z].*?(?=[А-ЯA-Z]) (первое совпадение)

Посмотреть вложение 99424
Спасибо, но это не совсем то что нужно.

У меня методом тыка получалась вот такая конструкция:
[\w\W][А-ЯA-Z].* - но она далеко не совершенна, подскажите как правильно можно сформулировать?

Ещё возможные варианты где нужно что-бы работала (помимо изначального который привёл):
Было: КАМИННАЯ вытяжка Русь MGB915 БЕЛАЯ
Стало: КАМИННАЯ вытяжка
(что бы первое слово не учитывало)

Было: Каминная-Вытяжка Русь MGB915 БЕЛАЯ
Стало: Каминная-Вытяжка
 
Последнее редактирование:

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 339
Благодарностей
9 088
Баллы
113
Спасибо, но это не совсем то что нужно.

У меня методом тыка получалась вот такая конструкция:
[\w\W][А-ЯA-Z].* - но она далеко не совершенна, подскажите как правильно можно сформулировать?

Ещё возможные варианты где нужно что-бы работала (помимо изначального который привёл):
Было: КАМИННАЯ вытяжка Русь MGB915 БЕЛАЯ
Стало: КАМИННАЯ вытяжка
(что бы первое слово не учитывало)

Было: Каминная-Вытяжка Русь MGB915 БЕЛАЯ
Стало: Каминная-Вытяжка
Увы, регулярки в простейшем применении не всесильны, тут только анализировать входной текст и производить с ним какие то манипуляции-преобразования перед обработкой регуляркой.

Например, вариант вх. текста "Каминная-Вытяжка Русь MGB915 БЕЛАЯ" можно сначала приводить в нижнему регистру и потом делать большой регистр у начала слов, соотв. приведется к такому виду "Каминная-вытяжка Русь MGB915 БЕЛАЯ" и тут уже выше-приведенная регулярка справится и выделит нужное "Каминная-вытяжка".
 
  • Спасибо
Реакции: TeslaCo

TeslaCo

Client
Регистрация
25.10.2016
Сообщения
62
Благодарностей
2
Баллы
8

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 339
Благодарностей
9 088
Баллы
113
Подскажите как это можно сделать на c#?
Регистр сменить не сложно, даже без C#.
Если важен C#, то вот:
C#:
// Текст для обработки
string text = project.ExecuteMacro("цу цуу цу цу цу");
// Обработка текста "ToUpper"
project.Variables["res"].Value = Macros.TextProcessing.ToUpper(text, "FirstLetters");
А вот выстроить какой то алгоритм универсальный, это уже задача по-сложнее. Пока затрудняюсь выстроить какой то такой универсальный алгоритм. При малейшем изменении во вх. тексте, все опять рухнет. Может знатоки C# подтянутся, подскажут?
@Alexmd @BAZAg @doc :dm:Призываю вас! :az::-)
 
Последнее редактирование:
  • Спасибо
Реакции: TeslaCo и BAZAg

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 787
Благодарностей
2 453
Баллы
113
Регистр сменить не сложно, даже без C#.
Если важен C#, то вот:
C#:
// Текст для обработки
string text = project.ExecuteMacro("цу цуу цу цу цу");
// Обработка текста "ToUpper"
project.Variables["res"].Value = Macros.TextProcessing.ToUpper(text, "FirstLetters");
А вот выстроить какой то алгоритм универсальный, это уже задача по-сложнее. Пока затрудняюсь выстроить какой то такой универсальный алгоритм. При малейшем изменении во вх. тексте, все опять рухнет. Может знатоки C# подтянутся, подскажут?
@Alexmd @BAZAg @doc :dm:Призываю вас! :az::-)
Я такие задачки решал бы примерно так, как описал ниже, так как составлять регулярки пока не научился.
Однозначно понимаю, что вполне условия могут продолжать меняться, из-за чего просто выносил бы дополнительные проверки в функции, и дергал бы их в зависимости от условия, расставляя маркеры того, что наступило то или иное состояние.
Подобную задачу недавно изучал тут, но, для своих целей применял её по другому.

Если же условие больше меняться не будет - то вариант ниже может решить эту проблему.

C#:
Func<char,bool> Check = (c) => { // Проверка что входит в диапазон  a-zA-Z
    if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) return true;
    return false;
};
Func<char,bool> Check2 = (c) => { // Проверка что буква заглавная
    if ((c >= 'А' && c <= 'Я') || (c >= 'A' && c <= 'Z')) return true;
    return false;
};

string line = "Каминная-Вытяжка Русь MGB915 БЕЛАЯ";
       line = "Каминная вытяжка MAUNFELD DREAM 60 ТЕМНОБЕЖЕВОЕ стекло";
       line = "Каминная вытяжка Русь MGB915 БЕЛАЯ";

bool check_first = false; // Маркер что прошли пробел и нужно две проверки
for(int i =0; i< line.Length;i++) {
    char x = line[i]; // взяли символ
    if(x == ' ') check_first = true; // Если это пробел - значит прошли первое слово
    bool check = false;
    if(!check_first) { // Если первое слово не пройдено - смотрим входит ли символ в диапазон a-zA-Z
        check = Check(x);
        if(check) return line.Remove(i); // Если входит - возвращаем результат от начала строки до этого символа
    }
    else {
        check = Check2(x); // если буква заглавная
        if(check) return line.Remove(i); // Если входит - возвращаем результат от начала строки до этого символа
       
        check = Check(x); // если диапазон a-zA-Z
        if(check) return line.Remove(i); // Если входит - возвращаем результат от начала строки до этого символа
    }
}
return line; // если не встретились символы, по которым нужно отрезать конец
 
Последнее редактирование:
  • Спасибо
Реакции: TeslaCo и Sergodjan

Кто просматривает тему: (Всего: 3, Пользователи: 0, Гости: 3)