Что не так с этим регулярным выражением (VBScript / JavaScript вкус)? - PullRequest
3 голосов
/ 20 мая 2010

Я пытаюсь запустить регулярное выражение в коде VBA, который использует регулярные выражения Microsoft VBScript 5.5 (должно совпадать с регулярным выражением JavaScript).

Регулярное выражение: ^[0-9A-Z]?[0-9A-Z]{3}[A-Z]?([0-9A-Z]{6})-?([0-9])?$
Ввод: X123A1234567
Совпадение: 123456

Шесть символов, которые меня интересуют, дают хорошее совпадение 123456, игнорируя последнюю (контрольную) цифру. Отлично. (Контрольная цифра снята, но для меня это не главное).

Но когда ОБА дополнительные части отсутствуют (они являются необязательными), совпадение захватывает последнюю цифру.

GOOD

Ввод: 123123456 Совпадение: 123456

Нет альфа, нет контрольной цифры. Хороший матч.

GOOD

Ввод: 123A1234567
Совпадение: 123456

Оставьте опциональную среднюю альфу, уберите опциональную начальную альфа, оставьте контрольную цифру, и мы все равно получим хорошее совпадение 123456.

GOOD

Ввод: X1231234567
Совпадение: 123456

Оставьте в необязательной ведущей альфе, уберите среднюю необязательную альфу, оставьте контрольную цифру, и мы все равно получим хорошее совпадение 123456.

BAD

Ввод: 1231234567
Совпадение: 234567

Удалите ОБА дополнительные необязательные символы, оставьте контрольную цифру, и мы получим неправильное совпадение 234567.

Посмотрите тестеры регулярных выражений на http://www.regular -expressions.info / javascriptexample.html или http://www.regular -expressions.info / vbscriptexample.html .

Что мне здесь не хватает? Как я могу получить регулярное выражение, чтобы игнорировать последнюю цифру, когда оба дополнительных альфа отсутствуют? Регулярное выражение используется для подачи в поисковую систему, поэтому независимо от формата входных данных мы можем сопоставить полное значение.

ОБНОВЛЕНИЕ: ни один из приведенных выше примеров не содержит дефис (показанный в регулярном выражении). Входные данные с дефисом и контрольной цифрой всегда совпадают.

ОБНОВЛЕНИЕ: рабочее регулярное выражение, благодаря приведенным ниже предложениям (спасибо!):

Регулярное выражение: ^[A-Z]?[0-9]{3}[A-Z]?([0-9]{6})-?([0-9])?$

Ответы [ 3 ]

2 голосов
/ 20 мая 2010

Если вы уберете необязательную начальную альфу, 1 соответствует первому классу символов [0-9A-Z]? и не будет причин отказываться от него, потому что совпадает все регулярное выражение - ведь последняя цифра необязательна в вашем регулярном выражении.*

Поскольку это не является необязательным (вы просто не хотите соответствовать ему), отбросьте конечный ?, и регулярное выражение должно сработать.

Или сделайте первую частьрегулярное выражение [A-Z]?, поэтому оно никогда не будет соответствовать числу - если это соответствует вашим правилам.

1 голос
/ 20 мая 2010

Если вам действительно не нужна последняя цифра, не делайте ее необязательной - выньте эту последнюю ? перед $

0 голосов
/ 20 мая 2010

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

([0-9A-Z]{6})\d$

Я также не уверен, если вам нужен - ?. Ни одна из ваших входных данных не указывает на это. (но вы могли бы добавить это)

Также более быстрый способ сделать это будет VB6-эквивалентом substr, если входные данные всегда одинаковой длины.

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