2015-12-03 5 views
2

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

#(?<nonCapturing>\?\:)?(?:\(\?(?![\)])(?<addOpt>[ar]*)(?:\-(?<remOpt>[ar]+))?\))?\b(?<id>\w+)\b(?:\[\]|(?:(?=\[)(?:[^\[\]]|(?<open>\[)|(?<subFormat-open>\]))+?(?(open)(?!))))?

Очень долго - извините. Он используется для анализа строки формата для произвольных объектов. Это позволяет мне указать свойство (например, IntValue) и перенаправить ему дополнительный дочерний формат.

Это соответствует # с последующим необязательным, не шаблон захвата ?:, а затем шаблон необязательного «Параметры» (?r) или (?a-r). Затем имя свойства следует за парой [].

Для следующего ввода:

Int: #IntValue Bool: #BoolValue[]Word Str: '#StrValue' Double: #DoubleValue[#.00] #(?r)Bar[#(?r)StrValue[#Length]]

это соответствует:.

  • #IntValue
  • #BoolValue []
  • #StrValue
  • #DoubleValue [# 00 ]
  • # (? R) Бар [# (? R) StrValue [#Length]]

Хорошо.

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

шаблон по умолчанию, чтобы сделать это: ((?!<regex that matches what you want>).)*

В моем случае, как будет выглядеть (Pattern: <REG>|(?<plain>(?:(?!<REG>).)+)) , что resuls в этом огромном регулярное выражение (ведьма maches отлично):

(?:#(?<nonCapturing>\?\:)?(?:\(\?(?![\)])(?<addOpt>[ar]*)(?:\-(?<remOpt>[ar]+))?\))?\b(?<id>\w+)\b(?:\[\]|(?:(?=\[)(?:[^\[\]]|(?<open>\[)|(?<subFormat-open>\]))+?(?(open)(?!))))?)|(?<plain>(?:(?!(?:#(?<nonCapturing>\?\:)?(?:\(\?(?![\)])(?<addOpt>[ar]*)(?:\-(?<remOpt>[ar]+))?\))?\b(?<id>\w+)\b(?:\[\]|(?:(?=\[)(?:[^\[\]]|(?<open>\[)|(?<subFormat-open>\]))+?(?(open)(?!))))?)|(?<plain>(?:(#(?<nonCapturing>\?\:)?(?:\(\?(?![\)])(?<addOpt>[ar]*)(?:\-(?<remOpt>[ar]+))?\))?\b(?<id>\w+)\b(?:\[\]|(?:(?=\[)(?:[^\[\]]|(?<open>\[)|(?<subFormat-open>\]))+?(?(open)(?!))))?).)+)).)+)

Puh. Он делает то, что должен, но ...

Есть ли другой способ сопоставить все, что не соответствует предыдущей части регулярного выражения?

Это ясно?

+0

Почему бы просто не сделать '! Regex.IsMatch (input);'? – Rob

+0

Похоже, что нет способа, если вы не хотите попробовать PCRE.net, где вы могли бы использовать глаголы PCRE '(* SKIP) (* F). Тем не менее, это будет длинное регулярное выражение. Возможно, вы можете сопоставить первый тип подстрок, а затем разделить их, чтобы получить остальное? –

+1

@Rob, потому что я разбираю строку. Мне нужны все части. Некоторые части соответствуют моей структуре свойств. Но теперь мне нужно все другое. 'Regex.IsMatch' проверяет, есть ли совпадение или нет. ДА Есть несколько совпадений. Вся строка будет сопоставлена. 'regex.IsMatch' мне не поможет. –

ответ

2

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

Добавить альтернативу шаблону: |[^#]+. Это будет потреблять все, кроме # символов, оставляя особые случаи, начиная с #, до первой части шаблона. Поэтому персонаж # всегда будет начинать новый матч.

Там еще небольшая загвоздка: у вас есть неопциональные id группу, окруженные два \b якорей в этой первой части, что означает, если у вас есть в строке ввода в #, не следует буква (скажем, что-то как foo#!bar), что # не будет соответствовать второй части шаблона.

Простым решением этой проблемы является использование |[^#]+|# в конце шаблона для учета этого случая кромки. Этот третий случай # будет соответствовать только в случае отказа первого случая.

+0

_Всегда это необязательно. Нет. 'Id' не является необязательным, но ваше объяснение работает. –

+0

О, хорошо, я, должно быть, видел '?', Которого нет –

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