RegEx для захвата определенного буквенно-цифрового шаблона

У меня есть эта строка, и я хочу знать, как извлечь часть «10-K_20190304_29

"nCABALLERO MARIA\r\n10.1-K\r\n10-K_20190304_29_1_20190515\r\n6204 DEPORTES SANTIAGO - PEÑALOLÉN"
20190515».

"nCABALLERO MARIA\r\n10.1-K\r\n10-K_20190304_29_1_20190515\r\n6204 DEPORTES SANTIAGO - PEÑALOLÉN"

Я пробовал это, .+(?<=_).+, но это дает мне больше символов, которые мне нужны.

Как решить эту проблему?


person Brian Smith    schedule 22.05.2019    source источник


Ответы (2)


Здесь нам нравится начинать с простой границы слева и справа, собирать данные о наших желаниях и сохранять их в группе захвата ($1). Давайте начнем с:

[0-9]{2}-.+[0-9]{8}

и давайте добавим нашу группу захвата:

([0-9]{2}-.+[0-9]{8})

ДЕМО

const regex = /[0-9]{2}-.+[0-9]{8}/gm;
const str = `nCABALLERO MARIA\\r\\n10.1-K\\r\\n10-K_20190304_29_1_20190515\\r\\n6204 DEPORTES SANTIAGO - PEÑALOLÉN`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

введите здесь описание изображения

регулярное выражение

Если это выражение нежелательно, его можно изменить или изменить на regex101.com.

Цепь регулярных выражений

jex.im визуализирует обычные выражения:

введите здесь описание изображения


Если мы хотим добавить больше границ, мы, безусловно, можем это сделать, в зависимости от того, как могут выглядеть наши возможные входные данные. Например, это выражение имеет больше границ:

([0-9]{2}-[A-Z]+_[0-9]{8}[0-9_]+.+?[0-9]{8})

ДЕМО

const regex = /([0-9]{2}-[A-Z]+_[0-9]{8}[0-9_]+.+?[0-9]{8})/gm;
const str = `nCABALLERO MARIA\\r\\n10.1-K\\r\\n10-K_20190304_29_1_20190515\\r\\n6204 DEPORTES SANTIAGO - PEÑALOLÉN`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

person Emma    schedule 22.05.2019
comment
Большое спасибо за ответ, но в полном тексте больше цифр и он не распознает, как мне это нужно. Вот почему я сопоставил его с _, потому что он появляется только в коде. Пожалуйста, если вы знаете, как сократить весь код, соответствующий _, это было бы потрясающе. - person Brian Smith; 23.05.2019
comment
Спасибо за вашу помощь, я надеюсь, что это поможет кому-то еще. Я решил самостоятельно; Когда мне приходит: 15317029-0_20190102_29_1_20190515\r, я просто: strCodigoPdf = strCodigoPdf.Substring(0,strCodigoPdf.Length()-0).Trim - person Brian Smith; 23.05.2019

Вы также можете использовать разделение для извлечения части «10-K_20190304_29

text.Split({“\r\n”},StringSplitOptions.None)(2)
20190515».

text.Split({“\r\n”},StringSplitOptions.None)(2)

введите здесь описание изображения

person NTP    schedule 22.05.2019