2016-05-07 8 views
1

У меня есть большой файл с сотнями блоков текста (части вызовов метода C++), которые напоминают блок Current ниже, и я хочу использовать Xcode's Regular замена Выражение для изменения каждого из них, чтобы походить на Desired блок ниже, захватывая значения 0.89f, имя, 0,1, 0,5 и 2.Как я могу использовать «Найти и заменить» Xcode на многострочных блоках текста

Current Block

Desired Block

Обратите внимание, что оба блока начинаются и заканчиваются остряк h new Zapp и //d.p.’s to show соответственно, чтобы сэкономить на загрузке ручного редактирования. Я хочу использовать поиск и замену регулярных выражений.

Основная проблема, с которой я сталкиваюсь, - это вид блоков в размере multi-line. Если мы будем игнорировать, что на данный момент, я почти выполнил поиск и замену на следующих single-line блоков:

ток:

Current Single-Line

new Zapp (0.89f // defaultParameterValue , "A name" // name , 0.1 // min , 0.5 // max , 2 // d.p.'s to show

Желаемая:

Desired Single-Line

new Zapp (NormalisableRange<float> (0.1, 0.5) ,NormalisableRange<float> (0.1, 0.5).convertTo0to1(0.89f) , "A name" // name , 2 // d.p.'s to show

Найти и заменить:

Найти: Zapp\s+\((.*)\s+// defaultParameterValue\s+,\s+"(.*)"\s+\/\/\s+name\s+,\s+(.*)\s+\/\/\s+min\s+,\s+(.*)\s+\/\/\s+max\s+,\s+(.*)\s+\/\/\s+d.p.'s

Заменить: Zapp (NormalisableRange<float> ($3, $4) ,NormalisableRange<float> ($3, $4).convertTo0to1($1) , "$2" // name , $5 // d.p.’s

Это однострочных решения имеет проблемы, дополнительное белое пространство видно после захвата 1 (1 пробел), захват 3 (4 пробела) и захват 5 (3 пробела), в противном случае он хорошо работает:

Comparison of Search and Replace output and ideal output

Я попытался устранить пробелы из захвата 1 (0.89f), захвата 3 (0,1) и захват 5 (2) с использованием [^\s]+, но это не помогло, так что если кто-нибудь может указать причину за это я был бы благодарен.

enter image description here

я могу, для чего это стоит, искать upper и lower с помощью \s+, но я не могу поставить все это вместе, чтобы достичь желаемого результата.

Я видел несколько старых сообщений в Интернете, которые предполагают, что эта задача может оказаться невозможной с помощью Xcode. Если это правда, может ли кто-нибудь предложить альтернативный подход, который выполнит эту работу?

ответ

1

Причина в том, что .* слишком жадна и соответствует пробелам, которые могли быть сопоставлены шаблоном \s+, но для этого жадного подшаблона.

Либо использовать ленивый/неохотой .*?:

Zapp\s+\((.*?)\s+// defaultParameterValue\s+,\s+"(.*)"\s+\/\/\s+name\s+,\s+(.*?)\s+\/\/\s+min\s+,\s+(.*?)\s+\/\/\s+max\s+,\s+(.*?)\s+\/\/\s+d.p.'s 

Смотрите regex demo

Или определить класс для согласования поплавков/целых чисел [-+\w.]+ (немного не точно, но будет делать с ожидаемым типом значения известен) или двойные кавычки литералы ("([^"\\]*(?:\\.[^"\\]*)*)"):

Zapp\s+\(([-+\w.]+)\s+// defaultParameterValue\s+,\s+"([^"\\]*(?:\\.[^"\\]*)*)"\s+\/\/\s+name\s+,\s+([-+\w.]+)\s+\/\/\s+min\s+,\s+([-+\w.]+)\s+\/\/\s+max\s+,\s+([-+\d.]+)\s+\/\/\s+d.p.'s 

См another demo

+0

Оба ваши ответы удовлетворяют вопрос в целом, поэтому я буду отмечать это как правильный ответ. Фактически вставка кода в поле поиска и замены Xcode не соответствует тексту, но это, по-видимому, является ограничением для многострочных блоков в Xcode. Я сам предоставил ответ, используя AppCode, который позволяет использовать многострочный поисковый запрос, чтобы помочь другим, которые могут использовать AppCode. Спасибо за ваш ответ, я кое-что узнал. –

0

См. Ответ Wiktor. Он дает два решения с демонстрационными примерами, которые удовлетворяют этой проблеме в целом.

Однако, благодаря ответу Рича Multi line search and replace tool, я обнаружил AppCode by JetBrains действительно будет делать поиск многострочного и заменить:

ПОИСК:

new Zapp\s+\(([^\s]+)\s+// defaultParameterValue\n\s+"(.*)"\s+\/\/\s+name\s+, ([^\s]+)\s+// min\n,\s+([^\s]+)\s+// max\n,\s+([^\s]+)\s+// d.p.'s to show

ЗАМЕНА:

new Zapp (NormalisableRange<float> ($3, $4)\n\t ,NormalisableRange<float> ($3, $4).convertTo0to1($1)\n\t\t\t , "$2" // name\n\t\t\t , $5 // d.p.'s to show