Проблема с использованием обычных регулярных выражений - PullRequest
1 голос
/ 30 марта 2011

У меня есть строка, содержащая исходный код другого файла groovy в следующем формате.

def str = "def testcaseObject{
           var1: "abc"               ,
           var2:  obj.map['abc']     ,
           var3: "xyz"               ,
           var4: obj.get(0)          ,
           var5: obj.random()        ,
.......   "

В исходном файле некоторые атрибуты по умолчанию являются строками, такими как abc и xyz, а некоторые другиетакие функции, как obj.map, obj.get и т. д.

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

В конце я бы хотел, чтобы приведенная выше строка была изменена как

def str = "def testcaseObject{
               var1: "abc"               ,
               var2: "obj.map['abc']    ",
               var3: "xyz"               ,
               var4: "obj.get(0)        ",
               var5: "obj.random()      ",
.......       "

Как этого добиться, используя простой метод replaceAll с использованием регулярных выражений в groovy?

1 Ответ

1 голос
/ 31 марта 2011

Этот код, кажется, делает то, что вы хотели:

def str = '''def testcaseObject{
           var1: "abc"               ,
           var2:  obj.map['abc']     ,
           var3: "xyz"               ,
           var4: obj.get(0)          ,
           var5: obj.random()        ,
.......   '''

println( str.replaceAll( /(?m)(.*)(obj.+)  ,/, '$1"$2",' ) )

Как это распечатывается:

def testcaseObject{
           var1: "abc"               ,
           var2:  "obj.map['abc']   ",
           var3: "xyz"               ,
           var4: "obj.get(0)        ",
           var5: "obj.random()      ",
.......   

Объяснение регулярного выражения

Регулярное выражение /(?m)(.*)(obj.+) ,/ делится на 3 части;

  1. (?m) Указывает groovy использовать многострочное сопоставление (поэтому оно будет применять регулярное выражение к каждой строке по очереди)
  2. Затем мы получаем нашу первую группу (.*), что означает «один или несколько символов», это будет входить в $1 при замене
  3. Затем существует вторая группа (obj.+), поэтому она ищет строку obj, за которой следуют один или более символов. Это войдет в $2 при замене
  4. и последняя часть "," ищет 2 пробела, за которыми следует запятая

Таким образом, для каждой строки, которая соответствует: some_text, за которым следует obj, за которым следует некоторый текст, за которым следуют 2 пробела и запятая, эта строка будет заменена на:

$1"$2",

где $1 - группа .*, а $ 2 - группа (obj.*)

Надеюсь, это объясняет это: -)

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