RegEx для соответствия 3 алфавита и 1-2 цифры - PullRequest
1 голос
/ 24 мая 2019

Я пытаюсь написать регулярное выражение, чтобы найти совпадение в тексте, содержащем не менее 100 символов. Совпадение должно быть таким: любая подстрока в строке, которая должна содержать не менее 3-х алфавитов, не менее 1 цифры после нее и не более 2 цифр после 3 букв.

Примеры -

  1. abcjkhklfd pdn24 hjkk - в этом случае я хочу извлечь pdn24

  2. hjdksfk pdf1 lkjk - в этом случае я хочу извлечь pdf1

  3. hjgjdks pdg34 kjfs dhj khk678jkfh lds1 - В этом случае мне нужны и pdg34, и lds1

Как мне написать регулярное выражение для этого? Длина начальных букв для совпадения всегда равна 3, а длина цифр может быть либо 1, либо 2 (не более, не менее)

Это то, что работает, если после 3-буквенной строки есть 2 цифры.

[A-Za-z]{3}[0-9]{2}

Но длина цифр может варьироваться от 1 до 2. Как включить переменную длину в регулярное выражение?

Ответы [ 2 ]

3 голосов
/ 24 мая 2019

Выражение, которое мы хотим разработать, довольно интересно.Сначала мы можем добавить ваше оригинальное выражение с небольшой модификацией в группу захвата, затем нам следует подумать о левой и правой границах вокруг него.Например, справа мы можем захотеть использовать \D:

([A-Za-z]{3}[0-9]{1,2})\D

DEMO 1

Мы можем точно определить точное ограниченное выражение.Тем не менее, это может просто сработать.


Основываясь на совете Кэри Свовеланд , мы также можем использовать это выражение, которое гораздо лучше:

\p{L}{3}\d{1,2}(?!\d)

enter image description here

Тест

re = /([A-Za-z]{3}[0-9]{1,2})\D/m
str = 'abcjkhklfdpdn24hjkk
hjdksfkpdf1lkjk
hjgjdkspdg34kjfs dhj khk678jkfhlds1 '

# Print the match result
str.scan(re) do |match|
    puts match.to_s
end

Этот скрипт показывает, как работает группа захвата:

const regex = /([A-Za-z]{3}[0-9]{1,2})\D/gm;
const str = `abcjkhklfdpdn24hjkk
hjdksfkpdf1lkjk
hjgjdkspdg34kjfs dhj khk678jkfhlds1 `;
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}`);
    });
}
2 голосов
/ 24 мая 2019

Как минимум 3 алфавита: [a-zA-Z]{3,} 1 или 2 цифры (не более, не менее): [0-9]{1,2}

Это дает нам:

/[a-zA-Z]{3,}[0-9]{1,2}/
...