Regex соответствует символу верхнего регистра, пока не встретится цифра

68
2

Я пытаюсь поймать строку, содержащую два или более символов в верхнем регистре. Конец строки всегда является числом. Иногда могут быть разрывы строк между буквами и числом, иногда нет. Вот что у меня есть до сих пор:

[A-Z-ÅÖÄ\s]+[^\d]

Двигатель основан на javascript.

Пример:

Входные данные:

ABC ABCDE XYZ
1
EFG XYZ ABC 2
not me
EFG ABC
3

Выход: match1: ABC ABCDE XYZ match2: EFG XYZ ABC match3: EFG ABC

спросил(а) 2017-02-18T16:59:00+03:00 3 года, 7 месяцев назад
1
Решение
70

Вы можете использовать это регулярное выражение в Javascript:

/^[A-Z]{2}[^]*?(?=\s*\d+$)/gm

Демоверсия ReGEx

RegEx Описание:

    ^ - начало линии [AZ]{2} - Матч 2 заглавные английские алфавиты [^]*? - Сопоставьте 0 или более любых символов (включая новую строку), ленивых (?=\s*\d+$) - Lookahead, который утверждает, что у нас есть 0 или более пробелов, за которыми следуют 1 или более цифр в конце.

Демо-версия кода:

var str = 'ABC ABCDE XYZ
1
EFG XYZ ABC 2
not me
EFG ABC
3';

var re = /^[A-Z]{2}[^]*?(?=\s*\d+$)/gm;

var m = str.match(re);

console.log(m);

ответил(а) 2017-02-18T17:17:00+03:00 3 года, 7 месяцев назад
57

Попробуй это:

^[A-Z]{2}( *[A-Z])*(?=\s\d$)

Смотрите демо-версию.

Или эта многоязычная версия (YMMV в JavaScript):

^\p{Lu}{2}( *\p{Lu})*(?=\s\d$)

Смотрите демо-версию.

Это обрабатывает все прописные буквы со всех языков (как предполагалось в вашей попытке, включая символы ÅÖÄ).

Ни один из них не будет соответствовать "ABC fail 1".

ответил(а) 2017-02-18T17:38:00+03:00 3 года, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема