2015-08-11 2 views
3

вот мое регулярное выражение demoрегулярное выражение - если первая цифра 1 возвращение 1, но если это 145 возвращение 145, но если его 133 возвращения 133

как вопрос гласит:

, если первая цифра 1 вернуться 1, но если это 145 145 возврат, но если его 133 возврата 133

образца dataa:

K'8134567 
K'81345678 
K'6134516789 
K'61345678 
K'643456 
K'646345678 
K'1234567890 
K'12345678901 
K'1454567890 <<<--- want 145 returned and not 1 
K'13345678901 <<<--- want 133 returned and not 1 
K'321456789
K'3213456789
K'365456789
K'893456789
K'655456789

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

K'(?|(?P<name1>81)\d+|(61)\d+|(64)\d+|(1)\d+|(44)\d+|(86)\d+|(678)\d+|(41)\d+|(49)\d+|(33)\d+|(685)\d+|(\d{1,3})\d+) 

регулярное выражение объяснил:

Я заинтересован в цифры после K»
Я ищу сделать это с помощью регулярных выражений, но не уверен, если это может быть сделано.
Что я хочу:
если номер начинается с 81 возвращением 81
если номер начинается с 61 возвращением 61
... если число начинается с чего-то я не заинтересован в возвращении другого (или его первый цифры 1-3)

Приведенные выше критерии работы:

, но мой вопрос, как я могу сделать следующие:
если кулак цифра 1, то возвращают 1 нО
, если первая цифра равна 1, а вторая и третья цифры - 45 возвратных 145 и не возвращают только 1
, если первая цифра равна 1, а вторая и третья цифры - 33 возврата 133 и не возвращаются только 1

Я полагаю, я должен положить что-то в этой части регулярного выражения |(1)\d+|

Som других вопросы для моей справки: ли регулярки сортировать данные в первую очередь? Является ли порядок поиска регулярных выражений важным для его реализации? Я, конечно, не хочу этого.

+0

'| (145 | 133 | 1) \ d + |' добавить это может сделать трюк, но порядок более importnat в регулярном выражении или в выборочных данных? я не хочу дублирования – HattrickNZ

ответ

2

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

K'(?P<name1>81|61|64|44|86|678|41|49|33|685|1(?:33|45)?|\d{2,3})\d+ 

Updated RegEx Demo

+1

, который выглядит более аккуратным. но этот '| 1 (?: 33 | 45) | 1 |' можно заменить на '| 1 (?: 33 | 45)? |', поскольку это то же самое, что и @ m.cekiera? – HattrickNZ

+0

Да, действительно, см. Мое обновленное регулярное выражение для более короткого регулярного выражения. – anubhava

+0

внесли некоторые изменения [здесь] (https://regex101.com/r/kO4mI1/9), поскольку хотели захватить 1, 2 или 3 цифры только так, чтобы добавить? если я правильно понимаю. но я нахожусь, чтобы подобрать 1 на линию, но вполне могу понять эту часть. хм, но это не захватывает 0, не уверен, почему? – HattrickNZ

0

Regex не сортирует ничего, но порядок вашего регулярного выражения важен, на самом деле на основе вашего механизма регулярных выражений это будет немного иначе, но поскольку большинство двигателей регулярных выражений используют традиционную NFA для синтаксического анализа, порядок важен.

И в этом случае вы можете просто нам следующее регулярное выражение или добавить его в регулярное выражение:

(?<=K')1(?:45|33)? 

См демонстрационном https://regex101.com/r/rT2yJ0/1

1

Попробуйте с:

K'(?|(?P<name1>81)\d+|(61)\d+|(64)\d+|(1(?:45|33)?)\d+|(44)\d+|(86)\d+|(678)\d+|(41)\d+|(49)\d+|(33)\d+|(685)\d+|(\d{1,3})\d+) 

DEMO

+0

'| (1 (?: 45 | 33)?) \ d + |' является первым '?' созданием опции 43 или 33 (то есть 143 или 133). что такое второй '?' делать? – HattrickNZ

+1

@HattrickNZ '?:' Для группы без захвата (не будет дополнительной группы для содержимого парадексов), а вторая '?' Предназначена для дополнительного сопоставления 43 или 33 после 1 –