Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Разобрать строку, как?


Автор: Elfet 26.8.2005, 13:34
У меня есть строка вида: числоxбуква числоxбуква Ну и мне нужно получить все эти числа и буквы smile Мне сказали что это легко делается через регулярные выражения smile но я не знаю как smile
smile smile
Добавлено @ 13:35
ЗЫ: Это в Общие вопросы по .NET

Автор: Competitor 26.8.2005, 17:16
ну а что сели просто пробежаться по массиву, сопоставляя каждый символ строки с зараннее уготованным массивом цифр.

Автор: nerezus 26.8.2005, 17:56
хм, чтобы не заводить новую тему: как в строке сделать замену участка? =)

Автор: Spawn™Production® 26.8.2005, 20:54
nerezus, хм, Replace ("Исходный текст", "что найти", "на что заменить")
Например Replace("123", "1", "4") = "423"

Автор: Bounz 26.8.2005, 23:46
Elfet
Вот тебе пример:
Код

  Regex rx = new Regex(@"\w\d\w");
  string mText = "";
  MatchCollection strSplit = rx.Matches("a1b c2d e3f");
  foreach (Match s in strSplit)
        mText += s.Value + "\n";
  MessageBox.Show(mText);

Используй пространство имен System.Text.RegularExpressions

Автор: Zdvig 19.9.2005, 16:15
Думаю вопрос похожий, чтобы не создавать новую тему.

Есть строка: "12345 тут текст произвольной длины"

Как прочитать все что правее "12345"?

Автор: Bounz 19.9.2005, 18:19
Цитата
Есть строка: "12345 тут текст произвольной длины"

Как прочитать все что правее "12345"?

Если ты точно знаешь что у тебя есть строка "12345", то ты можешь сделать так:
Код

string s = "12345 тут текст произвольной длины";
string news = s.Replace("12345 ", "");


Автор: Дрон 19.9.2005, 18:51
Zdvig
Ну либо так как сказал Bounz,
либо более общая задача: набор_цифр пробелы произвольный_текст

Вот рег. выражение:
Код

            string s = "126572121      deedijdeijdei cnjwnoe dwendwen";
            Regex reg = new Regex(@"\d+\s+(.*)");
            Match m = reg.Match(s);
            string text = null;
            if(m.Success)
                text = m.Groups[1].Captures[0].Value;

Добавлено @ 18:54
Регулярные выражения -- крутая штука smile

В данном примере:
\d+ означает одна или большее количество цифр
\s+ означает один или большее количество пробелов (знаков табуляции и др. непечатных символов)
.* означает любое количество любых символов

Автор: Zdvig 19.9.2005, 20:14
Дрон
Спасибо!!

Автор: lioness 24.8.2006, 11:02
Ну ПОЧЕМУ  smile  при вводе у меня НЕ отсеиваются мне НЕнужные символы !!
Жрёть все, что ни дашь.

Можно: буквы и цифры, пробелы. Знаки тоже можно, но кроме тех, которые я задала, как неразрешенные.

Код

              set
                {
                    Regex rx = new Regex(@"\w*\s*[^!§$%&/()=?#'+*]");
                    if (rx.IsMatch(value))   ppname = value;
                    else ErrMess = value +" is not a currency value";
                 }


Самый распростой пример !  Может нужно другой конструктор взять???

Автор: ivashkanet 24.8.2006, 11:14
Цитата(lioness @  24.8.2006,  11:02 Найти цитируемый пост)
@"\w*\s*[^!§$%&/()=?#'+*]"

lioness, имхо у тя что-то с самим регулярным выражением.
У тебя оно читается так:
любое количесво непробельных символов, потом любое количесво пробельных (белых-пробелов) символов, а потом один не "!§$%&/()=?#'+*" символ.
Поэтому он не найдет, например, такую строку: "$%"
P.S. А вообще напиши, что ты хочешь найти и какую строку проверяешь

Добавлено @ 11:16 
А хотя нет. Должен найти smile 
В общем: 
Цитата(ivashkanet @  24.8.2006,  11:14 Найти цитируемый пост)
какую строку проверяешь 

 smile 

Автор: lioness 24.8.2006, 11:25
Вот, например: "Gn BW Kraftwerke AG Kernkraftwerk Philippsburg BRD012 KK-BWR"

Вобщем, любые буквы и цифры, знаки тоже могут быть. Я бы хотела НЕ принимать знаки очевидно ошибочные. 

А я задала только для трех знаков???  Но у меня сглатывает сейчас любое количество... И любые знаки ...

Автор: ivashkanet 24.8.2006, 11:30
lioness, так она у тебя соответствует выражению, так как не содержит знаки 
Цитата(ivashkanet @  24.8.2006,  11:14 Найти цитируемый пост)
!§$%&/()=?#'+

А это, в принципе, у тебя единственное строгрое условие ("\w*\s*" строгим считаться не может)

Автор: lioness 24.8.2006, 11:42
Не, строку я привела, как пример, что там ИМЕЕТ ПРАВО быть.

Так глотает он у меня  Л-Ю-Б-Ы-Е. В том числе и те, которые в квадратных скобках поставила  smile 

Вот так исправить попробовала 
Код

Regex rx = new Regex(@"([0-9A-Za-z]|[ÄäÖöÜüß]|\s)*");


Я думала, вообще запретила знаки воодить. Так он и тут все слопал. 

Автор: mr.DUDA 24.8.2006, 11:52
FYI, для экспериментов с регулярными выражениями удобно пользоваться тулзами типа Regulator .NET или Regex Coach.

Автор: lioness 24.8.2006, 11:54
Вообще-то я не FYI   smile , а где эти tools-ы ? Что это такое?

Добавлено @ 12:06 
ВОТ ТАК СРАБОТАЛО !!

Код

Regex rx = new Regex(@"^([0-9A-Za-z]|[ÄäÖöÜüß]|[-_]|\s)*$");


Правда, я не хотела сильно ограничивать в знаках...  Но сработало только со строгим соответствием ^..$  
Как они там называются, позабыла Token, что ль ...

Автор: mr.DUDA 24.8.2006, 12:29
Цитата(lioness @  24.8.2006,  11:54 Найти цитируемый пост)
Вообще-то я не FYI

FYI = For Your Information  smile 

Цитата(lioness @  24.8.2006,  11:54 Найти цитируемый пост)
а где эти tools-ы ? Что это такое?

В гугле можно было найти:

http://weitz.de/files/regex-coach.exe
http://sourceforge.net/project/showfiles.php?group_id=105210

Цитата(lioness @  24.8.2006,  11:54 Найти цитируемый пост)
Что это такое?

Вводишь регулярное выражение, строку для разбора или путь к файлу - тулза выводит тебе инфу о регекспе (что и как оно делает), и результат разбора строки.

Автор: lioness 24.8.2006, 13:45
Цитата

FYI = For Your Information 


Я знаю только немецкое "zur Kenntnisse"  smile 

"Regex Coach"  попробовала (спасибА, забавно). Так вот там отсеивает, что надо и правильно. Переношу строку в код СиШарпа - там НЕ работает. Глотает опять всё подряд.  Только со значкАми  ^...$ взбодряется и начинает ругать неправильные символы.
ВотЪ.  Нигде вроде не напИсано, что их надо обязательно ставить... smile 


Вот ещё разница:   "Regex Coach"  нормально реагирует на ([A-Z])*\s+=?\s+([0-9])*\s+([A-Z])*, 
                                                    в СиШарпе нужно написАть:([A-Z]*)\s+=?\s+(([0-9])*)\s+([A-Z])*
иначе не пропускает компилятор.

У меня Visual C# 2005

Автор: mr.DUDA 24.8.2006, 14:19
Цитата(lioness @  24.8.2006,  13:45 Найти цитируемый пост)
Нигде вроде не напИсано, что их надо обязательно ставить...

А может просто RegexOptions.Singleline надо передавать в конструктор Regex ? smile

Автор: lioness 24.8.2006, 15:57
Не наюююю ...  Попробовала - не помогает  smile   Сколько там еще вариантов для конструктора... Пока методом научного тыка - и анализ строки вроде бы пошёл.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)