2015-05-05 2 views
0

Несколько продолжение моих previous вопроса:Исключить определенный шаблон из матча Regex

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

Tue 01/24/12 1/24/2012 2:56:25 PM 

В этом случае я бы хотел, чтобы он соответствовал части 1/24/2012 2:56:25 PM.

Мое предыдущее выражение похоже на приведенный выше ввод на 01/24/12 1 или что-то подобное.

Я был в состоянии сделать эту работу, по большей части, используя следующее выражение:

(?:\w\w\w (0?[1-9]|1[012])[- \/.](0?[1-9]|[12][0-9]|3[01])[- \/.](19|20)?\d\d)? (0?[1-9]|1[012])[- \/.](0?[1-9]|[12][0-9]|3[01])[- \/.](19|20)?\d\d((?: |\s*-\s*)(?:(?:([01]?\d|2[0-3]):)?([0-5]?\d):)?([0-5]?\d)(AM| PM)?)? 

Проблема здесь в том, что я не хочу, чтобы на самом деле включают Tue 01/24/12 бит в моем матче; Я хочу убедиться, что часть не соответствует. Я попытался использовать негативный взгляд вперед, добавив модификаторы ?! к первой группе, не участвующей в захвате, но это не совсем так, как я думал.

Я попытался найти похожие вопросы here и here, но ответы ничего не объяснили; они просто предоставили рабочее выражение для этого конкретного экземпляра.

+0

Пожалуйста, обратите внимание на протокол HTTPS : //regex101.com/r/tR0yT3/1, я думаю, вы также хотите записать '01/24/12' в своей строке ввода. –

+0

Я пытаюсь записать только дату, начинающуюся со второй даты ('1/24/2012' в примере), потому что после ее захвата я конвертирую ее в объект .NET datetime. –

+0

Да, но это отдельный матч. Посмотрите еще раз на https://regex101.com/r/tR0yT3/2 и совпадения. Вы используете C#? Отправьте свой код. –

ответ

1

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

В вашем случае, вам просто нужно создать группу, содержащую нужный выход, имея это в виду, я изменил ваше регулярное выражение немного и группа $ 4 имеют свой желаемый результат:

(?:\w\w\w (0?[1-9]|1[012])[- \/.](0?[1-9]|[12][0-9]|3[01])[- \/.](19|20)?\d\d)? ((0?[1-9]|1[012])[- \/.](0?[1-9]|[12][0-9]|3[01])[- \/.](19|20)?\d\d((?: |\s*-\s*)(?:(?:([01]?\d|2[0-3]):)?([0-5]?\d):)?([0-5]?\d)(AM| PM)?))? 

Проверено на RegExr. ком:

enter image description here

для решения вашего Разнос согласования вопроса, вам необходимо включить пробел после первого (...)? группа внутри второй (...)? группа (я включил как \ с?), оставив вас с:

(?:\w\w\w (0?[1-9]|1[012])[- \/.](0?[1-9]|[12][0-9]|3[01])[- \/.](19|20)?\d\d)?(\s?(0?[1-9]|1[012])[- \/.](0?[1-9]|[12][0-9]|3[01])[- \/.](19|20)?\d\d((?: |\s*-\s*)(?:(?:([01]?\d|2[0-3]):)?([0-5]?\d):)?([0-5]?\d)(AM| PM)?)) 

Также последняя группа не может быть (...)? иначе в противном случае вы встретите бесконечность.

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

+0

Мне было интересно, если бы это был лучший способ сделать это, но я не был уверен, есть ли более простой способ просто исключить конкретный шаблон. Это просто работает, но по какой-то причине оно соответствует любому пространственному символу в тексте. –

+0

Что вы подразумеваете под символами пробела? Можете ли вы привести мне пример? –

+0

Скриншот [здесь] (http: // imgur.com/0Bd4Ae7) –

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