2015-06-23 3 views
0

My RegExp очень ржавый! У меня есть два вопроса, связанные со следующим RegExpЕще один Reg Exp

Вопрос Часть 1

Я пытаюсь получить следующую RegExp работать

^.*\d{1}\.{1}\d{1}[A-Z]{5}.*$ 

То, что я пытаюсь передать это x1.1SMITHx или x1.1.JONESx

Где x может быть что угодно, любой длины, но SMITH или JONES часть входной s Tring проверяется на 5 символов верхнего регистра только

Так:

some preamble 1.1SMITH some more characters 123 
xyz1.1JONES some more characters 123 

как пройти

Но

another bit of string1.1SMITHABC some more characters 123 
xyz1.1ME some more characters 123 

не должны пройти, потому что SMITH теперь содержит 3 дополнительных символов, ABC , и ME - всего 2 символа. я только пройти, если после 1.1 существует 5 символов только

Вопрос Часть 2

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

, если я использую ^\d{1}$ я бы думал, что это будет проходить только если одна цифра присутствует

Он пройдет 5 но он также проходит 67

Он должен потерпеть неудачу 67, так как это две цифры в длину. RegExp должен проходить только в том случае, если присутствует 1 цифра.

+0

Часть 2: Я бы сказал [это, вероятно, ваш код] (http://3v4l.org/GTPhB). –

+0

Хорошо, спасибо, конечно, это мой код, вот что я пытаюсь работать. Я пробовал это в https://regex101.com/ – Rory

+0

Считаете ли вы, что ваш заголовок может быть полезен будущим читателям? –

ответ

0

Для первого, проверить это регулярное выражение:

^.*\d\.\d[A-Z]{5}[^A-Z]*$ 

Прежде чем решать проблему, я сделал это легче читать, удаляя все {1}. Это ненужный квалификатор, так как regex по умолчанию будет искать один символ (/abc/ соответствует abc не aaabbbccc).

Для устранения проблемы нам просто нужно заменить ваш окончательный .*. Это говорит о совпадении с символами 0+. Если мы сделаем этот «точечный матч-все» более конкретным (т. Е. [^A-Z]), вы не будете соответствовать SMITHABC.

+0

спасибо. Проблема в том, что RegEx автоматически генерируется из старого приложения C++, я пытаюсь отлаживать. Вот почему заявление не так эффективно. Стажер C++-приложений получает список правил, созданных из старого приложения PERL! – Rory

0

Я думаю, что второй RE должен быть

(\d{2})\D*$ 

Это будет соответствовать ровно 2 цифры, за которыми следуют ноль или более не цифр.$, если он добавлен, сделает соответствие RE последним 2 цифры текста.

0

Я придумал ряд решений, но мне они больше всего нравятся. Если ваш двигатель RegEx поддерживает отрицательный смотреть вперед и отрицательный взгляд, позади, вы можете использовать это:

Part 1: (?<![A-Z])[A-Z]{5}(?![A-Z]) 
Part 2: (?<!\d)\d(?!\d) 

Оба имеют структуру (?<!expr)expr(?!expr).

  • (?<!...) - отрицательный внешний вид, что означает, что совпадению не предшествует выражение в скобке.
  • (?!...) - отрицательный внешний вид, означающий, что соответствие не сопровождается выражением в скобке.

Итак: для первого шаблона это означает «найти 5 символов в верхнем регистре, которые не имеют ни предшествующего, ни последующего символа верхнего регистра». Другими словами, точно соответствуют 5 заглавных букв.

Второй шаблон работает одинаково: найдите цифру, которой не предшествует или не следует другая цифра.

Вы можете попробовать это на Regex 101.

+0

Спасибо, это очень хорошо работает – Rory

+0

@Rory приветствуется. Просто говорю... –

Смежные вопросы