2016-03-02 3 views
1

Я использую следующее регулярное выражение для разбора мой лог-файл приложения для поиска конкретной строкиУбедитесь, что наличие определенного символа в строке

\[\s*\b(?:[0-9A-Za-z][0-9A-Za-z-_.#]{0,200})(?:\.(?:[0-9*A-Za-z][0-9A-Za-z-_.#]{0,200}))*(\.?|\b)\s*] 

Это прекрасно работает, но теперь нам нужно, чтобы убедиться, что строка «должна» содержать символ «-» для соответствия. Я смущен, чтобы добавить это условие к исходному регистру. Любые указатели были бы полезны.

Спасибо и наилучшие пожелания, Santhosh

+0

ли '-' должен быть в определенном месте? – Trasiva

+0

@Trasiva, нам просто нужно обеспечить присутствие. Он не зависит от местоположения. – kallada

+0

Я всегда создаю свои регулярные запросы, тестируя их с помощью этого замечательного инструмента: http://regexr.com/. Вы можете видеть, работает ли ваш запрос в реальном времени при внесении изменений в него, делает работу с регулярным выражением a много проще :) – Kocik

ответ

2

Регулярное выражение соответствует строке внутри квадратных скобок, [ и ], и может состоять только из непредставленных [ и не- ] символов.

Вы можете легко добавить положительное ограничение опережения после открытия [ как проверки, если кроме ] и [ следующие символы следуют с -:

\[           # opening [ 
    (?=[^\]\[]*-)        # There must be a hyphen in [...] 
    \s*           # 0+ whitespaces 
    \b(?:[0-9A-Za-z][0-9A-Za-z-_.#]{0,200})  # Part 1 (with obligatory subpattern) 
    (?:\.          # Part 2, optional 
     (?:[0-9*A-Za-z][0-9A-Za-z-_.#]{0,200}) 
)* 
    (\.?|\b)         # optional . or word boundary 
\s*           # 0+ whitespaces 
]            # closing ] 

Смотрите regex demo

и А one-liner:

\[(?=[^\]\[]*-)\s*\b(?:[0-9A-Za-z][0-9A-Za-z-_.#]{0,200})(?:\.(?:[0-9*A-Za-z][0-9A-Za-z-_.#]{0,200}))*(\.?|\b)\s*] 

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

Если вам нужно, чтобы соответствовать только если - или @ присутствует внутри [...], модифицировать предпросмотр в (?=[^\]\[]*[[email protected]]). Для более общего случая используйте (?=[^\]\[]*(?:one|another|must-be-present)) альтернативы внутри дополнительной группы внутри lookahead.

+0

Это хорошая идея проверить возможность «взломать» код и уметь добавлять другое (и текущее) ограничение через сам код. –

+0

Большое спасибо. Теперь я столкнулся с ситуацией, когда мне нужно проверить - или @ для полного успеха. Поэтому я попытался изменить (? = [^ \] \ [] * -) # Должна быть дефис в [...] этой строке как (? = [^ \] \ [] * - | @) # Там должен быть дефис или @ в [...]. Но все же выражение не рассматривает stings с @. – kallada

+0

Если должны быть '-' или' @ ', измените lookahead как' (? = [^ \] \ [] * [- @]) '. –

0

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

if (myString.indexOf('-') >= 0) { 
    //your code 
} 
+0

Можем ли мы сделать то же самое с регулярным выражением? – kallada

+0

Да, мы можем :). –

0

Если вы должны иметь одного дефис, вам придется либо повторить большую часть рисунка, или проверять его на втором этапе:

if re.match(pattern, line): 
    if not '-' in line: 
     raise MissingDash('No dash in line: {}'.format(line)) 

Я бы предложить добавить второй проверьте, поскольку добавление требования к регулярному выражению сделает его еще более ужасным для чтения.

+0

Почему Python? Регулярное выражение не ужасно читается, это совершенно ясно для меня. –

+0

Они используют регулярное выражение с * некоторым * языком, а Python довольно легко читать и понимать на этом уровне. Что касается «зачем это делать в коде», то, вероятно, для OP будет легче работать. –

+0

Я согласен, но требование является обязательным требованием. Когда языковой тег не добавляется, ответ на определенный язык подобен снимку в темноте. На самом деле это регулярное выражение не ужасно. Это намного хуже, когда шаблон заполнен обратными ссылками, обратными вызовами и вызовами подпрограмм (или сбалансированными конструкциями). Это классический линейный шаблон, содержащий только классы символов, группы, кванторы, литералы. Это немного дольше, чем могло бы быть, но при расколе это читаемо. –

1

Обновленный ответ - Assertion

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

Я знаю, что это просто, но с использованием Outter псевдо-якорный текст \[ ... \] как
разделителем, который не может существовать в организме является редкостью.

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

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

Опять же, это относится к mid-string Соответствие.
BOL/EOL - совсем другая вещь ^$, и является более постоянной конструкцией
, с которой можно использовать рычаги.

Всегда лучше кодоваться умнее.

\[\s*\b(?=[0-9A-Za-z][0-9A-Za-z_.#]{0,199}-|[0-9A-Za-z][0-9A-Za-z_.#]{0,200}(?:\.[0-9*A-Za-z][0-9A-Za-z_.#]{0,200})*\.[0-9*A-Za-z][0-9A-Za-z_.#]{0,199}-)(?:[0-9A-Za-z][0-9A-Za-z_.#-]{0,200})(?:\.(?:[0-9*A-Za-z][0-9A-Za-z_.#-]{0,200}))*(\.?|\b)\s*\] 

Использования Conditionals

Если ваш двигатель поддерживает условные, легкий путь, чтобы не полагаться на лапе
псевды якорный текст, то есть. [..].

\[\s*\b[0-9A-Za-z](?:[0-9A-Za-z_.#]|(-)){0,200}(?:\.(?:[0-9*A-Za-z](?:[0-9A-Za-z_.#]|(-)){0,200}))*(\.?|\b)\s*\](?(1)|(?(2)|(?!)))

Expanded

\[ \s* \b 
[0-9A-Za-z] 
(?: 
     [0-9A-Za-z_.#] 
    | (-)       # (1) 
){0,200} 
(?: 
     \. 
     (?: 
      [0-9*A-Za-z] 
      (?: 
       [0-9A-Za-z_.#] 
      | (-)       # (2) 
      ){0,200} 
    ) 
)* 
(\.? | \b)     # (3) 
\s* \] 

(?(1)       # Fail if no dash found 
    | (?(2) 
     | (?!) 
    ) 
) 
+0

К сожалению, у меня нет поддержки для условных обозначений – kallada

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