регулярное выражение для конкретного префикса цифры - PullRequest
0 голосов
/ 13 марта 2011

Я пытаюсь использовать следующее правило regx, но не могу найти решение.

Извините, если я не прояснил это.Я хочу для каждого правила разные regx.Я использую Java.

  • правило должно сбой для всех вводов цифр начинаются с префикса «1900» или «1901».(190011 - сбой, 190111 - сбой, 41900 - успех ...)

  • правило должно быть успешным для всех цифровых вводов с префиксом '*'

различные регулярные выражения для каждого правила (я не ищу комбинации их обоих)

Ответы [ 2 ]

1 голос
/ 13 марта 2011

Подходит ли этот RE для цели? :

'\A(\*|(?!190[01])).*'

\ A означает «начало строки». Я думаю, что то же самое в регулярных выражениях Java

.

EDIT

\A: "с самого начала строки ....". В Python (что на самом деле мне известно) это можно опустить, если мы используем функцию match(), которая всегда анализирует с самого начала, вместо search(), которая ищет всюду в строке. Если вы хотите, чтобы регулярное выражение могло анализировать строки с самого начала каждой строки, это должно быть заменено на ^

(...|...): ".... должен быть один из двух следующих параметров: ....."

\*: «... первый вариант - только один символ, звезда; ...». Поскольку звезда - это специальный символ, означающий 'ноль, один или несколько раз больше, чем' в строках регулярного выражения, она должна быть экранирована, чтобы строго означать 'звезду' .

(?!190[01]): "... второй вариант - это не шаблон, который должен быть найден и, возможно, перехвачен, а шаблон, который должен отсутствовать (все еще после самого начала). ...". Два символа ?! - это то, что говорит , 'не должно быть следующих символов' . Не найденный шаблон состоит из 4 целых символов: '1900' или '1901' .

(?!.......) - негативное прогнозное утверждение. Все виды утверждений начинаются с (?: круглые скобки сводят на нет привычное значение ?, поэтому все утверждения всегда пишутся с круглыми скобками.

Если \* соответствует, один символ был израсходован. Напротив, если утверждение проверено, соответствующие 4 первых символа строки не были использованы: двигатель регулярного выражения прошел через проанализированную строку до 4-го символа, чтобы проверить их, а затем вернулся к исходному состоянию. положение, то есть, в настоящее время, в самом начале строки.

Если вы хотите, чтобы необязательная часть (...|...) не была группой захвата, вы напишите ?: сразу после первого соединения, тогда '\A(?:\*|(?!190[01])).*'

.*: После начального шаблона (одна звезда поймана / совпала или подтверждено утверждение) двигатель регулярного выражения работает и перехватывает все символы до конца строки. Если в строке есть символы новой строки, и вы хотите, чтобы регулярное выражение перехватывало все символы до конца строки, а не только строки, вы укажете, что . также должно соответствовать символам новой строки (в Python это с re.MULTILINE ), или вы замените .* на (.|\r|\n)*

Наконец-то я понимаю, что вы, очевидно, хотите ловить строки, состоящие из цифр. В этом случае RE необходимо изменить на '\A(?:\*|(?!190[01]))\d*'. Этот RE совпадает с пустыми строками. Если вы хотите, чтобы не совпадало с пустыми строками, вместо \d* введите \d+. Если вы хотите, чтобы только строки имели хотя бы одну цифру, даже после звездочки, когда она начинается со звездочки, сопоставьте, затем выполните '\A(?:\*|(?!190[01]))(?=\d)\d*'

0 голосов
/ 13 марта 2011

Для первого правила вы должны использовать комбинированное регулярное выражение с двумя захватами, один для захвата случая с префиксом 1900/1901, а другой захват для остальных. Затем вы можете решить, будет ли строка успешной или нет, изучив два захвата:

(190[01]\d+)|(\d+)

Или просто 190[01]\d+ и отрицание вашей логики.

Regex не очень хорошо умеют что-то исключать.

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

Похоже, вы пытаетесь исключить номера телефонов 1-900 / 901 в США. Если количество цифр определено, вы можете использовать отрицательный запрос, чтобы исключить этот префикс при сопоставлении с остальными точными цифрами.

Для второго правила просто:

\*\d+

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...