2016-01-25 9 views
0

У меня есть небольшая проблема здесь. Я пытаюсь найти Regex, который будет соответствовать всем парование примеры:Regex шаблон выпуск C#

  • метод ("Команда Подробности")

    Если вернуться: команды Подробности

  • Метод (@ "Команда подробнее пункт

    и более

    и Подробнее»)

    Если вернуться: команды Подробности пункта и все больше и больше

  • метод ("Команда \" Подробнее \ "")

    Если вернуться: Команда "Детали"

  • Метод (@ "Команда "" подробности", "")

    Если вернуться: Команда "Детали"

  • Метод (@ "Команда

    "" Подробности" "")

    Если вернуться: Team

    "Детали"

мне удалось создать регулярное выражение образец:

Method\(.*\"(.*)\".*\) 

whcih работает в первом примере и частично второй, но мне было очень сложно создать один шаблон для всех 5 примеров. Любая помощь ?

Приветствия

+0

Хороший способ решить этот тип проблемы - создать 1 регулярное выражение для каждого совпадения, а затем просто использовать (regexp1 | regexp2 | regexp3) – neuhaus

ответ

2

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

Простейший способ добиться этого - сделать квантор * ленивым.

(?s)Method\(.*?\"(.*?)\".*?\) 

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

Вы могли бы сделать его более устойчивым, ограничивая набор допустимых символов, учитывая или удвоенного цитаты:

Method\([^\"]*\"((?:""|\\.|[^\"\\]+)*)\"[^\"]*\) 

Попробуй live on regex101.com.

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

+0

Большое спасибо, ваше регулярное выражение отлично работает – prusikt

1

использовать выражение следующим образом: Method\(\s*@?(.+?)\) (пример here). Вам нужно будет указать флаг s. Это позволит символу периода также соответствовать новым строкам, что вам нужно для второго примера.

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

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