使用常规正则表达式的问题

时间:2011-03-30 08:47:12

标签: groovy

我有一个字符串,其中包含以下格式的其他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()      ",
.......       "

如何使用groovy中使用正则表达式的简单replaceAll方法实现此目的?

1 个答案:

答案 0 :(得分:1)

此代码似乎符合您的要求:

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使用多行匹配(因此它会依次将regexp应用于每一行)
  2. 然后我们获得第一个小组(.*),意思是“一个或多个字符”,这将替换为$1
  3. 然后,有第二个组(obj.+),因此它会查找字符串obj,后跟一个或多个字符。这将在替换<{li>中进入$2
  4. 和最后一部分“,”查找2个空格后跟逗号
  5. 因此,对于匹配的每一行:some_text后跟obj后跟一些文字后跟2个空格和逗号,它将用以下内容替换整行:

    $1"$2",
    

    其中$1.*组,$ 2是(obj.*)

    希望这能解释它: - )