Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Regex patern

Привет.
нужна помощь в составлении шаблона для регулярки.
Есть строка:
@"<a class=""MyClass"" href="" rel=""nofollow"">myAlias</a>"
из неё надо выделить такие части:
myAlias
или
myAlias

выделить эти части по одному- не проблема.
можно ли выделить сразу две части за один проход?

что-то типа:
(?<=\<a class=\"MyClass\")(\"[часть1]+\")(\>[часть2]+)(?=\<\/a\>)

Спасибо.
Ответ: Сон Веры Павловны,

да, я пользовался этой библиотекой.
где-то читал, что если требуется вытащить только один тег, то быстрее будет регулярками,
чем отстраивать всё дерево.(?)
Вопрос: Gnu regex (egrep) multiline matching and extending ctags

Здравствуйте!
Подскажите пожайлуста, поддерживает ли gnu regex многострочный поиск. Расширяю ctags+tagbar с помощью регулярок (--regex-<lang>), но я так понимаю регулярки gnu regex не поддерживают многострочный поиск. Если это так, то как поступить, чтобы была возможность многострочного поиска.

Насколько я понимаю, нужно написать расширение для ctags на C без поддержки регулярок, или подключить к этим регуляркам pcre-движок? Какие еще есть варианты?
Ответ: сам не пробовал,
но если глянуть на Configure.ac при сборке Exuberant Ctags,
то можно увидеть:
Код C
1
2
3
4
5
6
7
8
9
10
11
# Checks for configuration options
# --------------------------------
 
AC_ARG_WITH(posix-regex,
[  --with-posix-regex      use Posix regex interface, if available])
 
AC_ARG_WITH(readlib,
[  --with-readlib          include readtags library object during install])
 
# AC_ARG_WITH(perl-regex,
# [  --with-perl-regex       use Perl pcre interface, if available])
строчка с опцией pcre здесь почему-то закомментирована, правда. и далее в этом файле тоже.

разбирайся )
Вопрос: Exception в Regex

Здравствуйте.
Использую regex, чтобы в строке найти символы, введённые в textbox'е.
При вводе в textbox'e нескольких подряд идущих спец. символов создания шаблона для регулярки ('^', '?', '$', '+', ...) вылетает исключение.
К примеру, ввожу "{123, 321}", или "???", или "+++" и вылетает exception.
C#
1
Regex regex = new Regex(KeyWord.Text, RegexOptions.IgnoreCase);
Подскажите пожалуйста, как избежать эту неприятность?

P.S.
Пока что попробую "костылём": буду в textbox'е делать замену двух подряд идущих вышеприведённых символов.
Но как быть с "{n,m}" и другими?
Надеюсь, есть "нормальное" решение этой проблемы.
Ответ: OwenGlendower, Спасибо, так, пожалуй, лучше. Однако, не хотелось бы наблюдать в текстбоксе такие вещи: "\?\\\|\[\{\*".
То есть перед каждым спец. символом стоит экранирующий символ.
Можно ли сделать так, чтобы и regex символы игнорировал, и в textbox'e символы не добавлялись?

Добавлено через 3 минуты
Пожалуй, можно сразу после обработки строки regex'ом, менять
Простите, глупость просто сделал:
C#
1
KeyWord.Text = System.Text.RegularExpressions.Regex.Escape(KeyWord.Text);
Теперь просто ввёл доп. переменную:
C#
1
2
string StrTemp = KeyWord.Text;
StrTemp = System.Text.RegularExpressions.Regex.Escape(StrTemp);
Задача решена. Спасибо, можно закрывать.
Вопрос: Компиляция regex на лету

Есть строки
505.762-RC 34
505.762-RB 34
Для поиска нужной строки пользователь вводит
5*B
Далее код:
C#
1
2
3
4
5
6
string first = param.RemoveRightPart("*");
string second = param.RemoveLeftPart("*");
Regex reg = new Regex(@"(" + first + @").*(" + second + @").*");
var er1 = StructuralTreeModel.Where(rr => reg.IsMatch(rr.DisplayText))
                    .Select(e => e)
                    .ToList();
Вывод:
505.762-RB 34
Но тут пользователь ввёл:
5*5*34
и по идее должен быть код:
C#
1
2
3
4
5
string[] newparam = param.Split("*");
Regex reg = new Regex(@"(" + newparam[0]+ @").*(" + newparam[1]+ @").*" + @"(" + newparam[2] + @").*");
var er1 = StructuralTreeModel.Where(rr => reg.IsMatch(rr.DisplayText))
                    .Select(e => e)
                    .ToList();
И вывод:
505.762-RC 34
505.762-RB 34
Вопрос: можно ли автоматически как то генерировать Regex не зная заранее количество параметров? Конкретно на моём примере. Текст всегда разделён * нечитаемых символов нет, только буквы и цифры.
Ответ:
Сообщение от skilllab
Вопрос: можно ли автоматически как то генерировать Regex не зная заранее количество параметров? Конкретно на моём примере. Текст всегда разделён * нечитаемых символов нет, только буквы и цифры.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            string[] examples =
            {
                "505.762-RC 34",
                "505.762-RB 34"
            };
 
            //pattern
            var pattern = "5*5*34";
 
            //adjust pattern
            pattern = Regex.Escape(pattern).Replace(@"\*", ".*?");
 
            //search
            foreach(var res in examples.Where(e=>Regex.IsMatch(e, pattern)))
                Console.WriteLine(res);
Вопрос: Выделение подстроки regex

Доброго времени суток С устройств поступают строки
C#
1
"\r\n+CBC: 0,75\r\n\r\nOK\r\n"
C#
1
"\r\n+CBC: 0,75,4.585V\r\n\r\nOK\r\n"

необходимо с помощью регулярных выражений Regex.Matches определить что в этой строке присутствует ключ +CBC: и выделить последние цифры после запятой. Количество цифровых знаков может изменяться от 1 до 3.

Для строки
C#
1
"\r\n+CBC: 0,75\r\n\r\nOK\r\n"
поиск выполняю так
C#
1
var cbc = Convert.ToInt16(Regex.Matches(Sender.ToString(), @"(\d{1,3})")[1].Value.Replace(",", ""));
Работает но как частный случай Если приходит вторая строка условие поиска надо менять

Со второй строки необходимо выделить 4.585V Здесь также количество знаков меняется.
Ответ:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    string[] input =
    {
        "\r\n+CBC: 0,75,4.585V\r\n\r\nOK\r\n",
        "\r\n+CBC: 0,75\r\n\r\nOK\r\n"
    };
    
    string pattern = @"(?<=CBC:\s*).*,(?<last>[^\r\n]*)";
    var regex = new Regex(pattern, RegexOptions.Multiline);
 
    Array.ForEach(input, str =>
    {
        var match = regex.Match(str);
        
        if (match.Success)
        {
            Console.WriteLine($"'{Regex.Escape(str)}' contains 'СВС', value = {match.Groups["last"].Value}");
        }
        else
        {
            Console.WriteLine($"'{Regex.Escape(str)}' doesn't contain 'СВС'");
        }
        Console.WriteLine();
    })
Вопрос: RegEx Какую регулярку использовать для этой строки

Какую регулярку использовать для того чтобы парсить это значение 883003a8a5663ff2677230cc4f3d8092
отсюда ::
Код HTML5
1
<input type="hidden" name="postkey" id="postkey" value="883003a8a5663ff2677230cc4f3d8092" />
Я сделал, но немного извращенно
т.к не шарю в парсинге с регулярками..

Код C#
1
2
3
4
5
6
Regex reg = new Regex("<input type=\"hidden\" name=\"postkey\" id=\"postkey\" value=\"(.*?)\" />");
                
                foreach (Match m in reg.Matches(HTML))
                {string postkey = m.ToString().Replace("<input type=\"hidden\" name=\"postkey\" id=\"postkey\" value=\"","");
                postkey = postkey.Replace("\" />", "");
                }
Подскажите способ по проще)
Спасибо за ранее!

Добавлено через 34 минуты
И отсюда:
Код HTML5
1
<div id="subiste-viendo"><h1>just upload <a href="/images/91logo.png">91logo.png</a> (2.58 KB - 236x64px)</h1></div>
это 91logo.png
Ответ: 1)
Код C#
1
2
3
string s = "<input type=\"hidden\" name=\"postkey\" id=\"postkey\" value=\"883003a8a5663ff2677230cc4f3d8092\" />";
foreach (Match m in Regex.Matches(s, @"(?<=<input.*value="")\w+(?="")"))
     Console.WriteLine(m);
2)
Код C#
1
2
3
string s = "<div id=\"subiste-viendo\"><h1>just upload <a href=\"/images/91logo.png\">91logo.png</a> (2.58 KB - 236x64px)</h1></div>";
foreach (Match m in Regex.Matches(s, @"(?<=<a.*href="")[^""]+(?="")"))
     Console.WriteLine(m);
Вопрос: Достать из строки все цифры с помощью Regex

Всем здравствуйте! Есть строка "012345". С помощью регулярного выражения хочется в ней распознать все цифры. Результат распознавания сохраняю в переменной match типа smatch. Как можно составить регулярное выражение, дающее в результате match[1]="0", match[2]="1", ..., match[6]="5"? Моя проблема в том, что сама строка может содержать любое количество цифр.

Есть код, выдающий не тот результат:

Код C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
#include <regex>
 
using namespace std;
 
void showInfo(const smatch& match) {
    cout << "match.size() = " << match.size() << "\n";
    for (int i = 0; i < match.size(); i++)
        cout << "match[" << i << "] = " << match[i] << "\n";
    cout.flush();
}
 
int main() {
    regex re(R"(([0-9])+)");
    string text = "012345";
    smatch match;
 
    regex_search(text, match, re);
    showInfo(match);
}
Вывод:

Код Code
1
2
3
match.size() = 2
match[0]     = 012345
match[1]     = 5

Желаемый результат:

Код Code
1
2
3
4
5
6
7
8
match.size() = 7
match[0]     = 012345
match[1]     = 0
match[2]     = 1
match[3]     = 2
match[4]     = 3
match[5]     = 4
match[6]     = 5
Ответ: testuser, это не так делается, а вот так:
Код C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <string>
#include <regex>
 
int main() {
    const std::string s{"012345"};
 
    std::regex ololo("\\d");
    std::sregex_token_iterator iter(s.begin(), s.end(), ololo);
    std::sregex_token_iterator end;
 
    for (; iter != end; ++iter) {
        std::cout << iter->str() << '\n';
    }
}
Вопрос: Regex. Цифры и математические знаки

Добрый день.
Подскажите что не так с этим выражением:
Код C#
1
Regex regexExpression = new Regex(@"^(?:((-?\d+)(,\d+)?)+[*+/-])+((-?\d+)(,\d+)?)|((-?\d+)(\.\d+)?)+$");
Оно должно отлавливать только цифры и математические знаки, это работает, но оно отлавливает и такие строки как "C2"
Ответ: Разобрался,
Код C#
1
 Regex regexExpression = new Regex(@"^((?:((-?\d+)(,\d+)?)+[*+/-])+((-?\d+)(,\d+)?)+)|^(-?\d+)(\.\d+)?$");
так работает
Вопрос: С# нужно написать комментарий к коду (Regex + LINQ)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
string[] result = new string[500];
            Regex re = new Regex(@"[a-z|A-Z|а-я|А-Я|0-9|,|.|!|?]");
            var query = from chr in str
                        where re.IsMatch(chr.ToString())
                        group chr by chr into g
                        select new { Char = g.Key, Cnt = g.Count() };
           
            int index = 0;//индекс 
            foreach (var pair in query)
            {
               result[index] =  String.Format("Буква: {0} - Количество: {1}", pair.Char, pair.Cnt);//сохраняем 
               index++;
            };
            return result;
Ответ:
C#
1
Regex re = new Regex(@"[a-z|A-Z|а-я|А-Я|0-9|,|.|!|?]"); //  Диапазон символов
Вопрос: Как сравнивать regex выражения?

C++
1
2
3
    std::vector <std::regex> lex;
    lex.push_back(std::regex("^([\(])*"));
    lex.push_back(std::regex("^([\)])*"));
Вот как сравнить два выражения, положенных в lex?
Ответ:
Сообщение от elllkk
Вот как сравнить два выражения, положенных в lex?
Экземпляры типа std::regex нельзя сравнивать между собой, на сколько я понял.

Сравнивать можно строки из которых они конструируются. Ну или создать свой тип и унаследовать его от std::basic_regex и хранить в нем исходную строку.