如何在正则表达式中选择多个多行组

时间:2014-06-17 02:55:10

标签: regex groovy

我有以下文字:

ajhsdkjad lkajsdkl a
 sadkjalksd  a lkjdsadk a
//#IF HI
//#as sjhdjakdj  jlkajs kja
#sa ajkdslkaj dlkasd kasdklj
//#ENDIF
a djalk jskdj kls jdklsjd
//#IF HI 
a sjkalj dklajskl klsjd s
//#ENDIF
a sjkldajdlkasksss

想要获得以下群组:

1)
    //#IF HI
    //#as sjhdjakdj  jlkajs kja
    #sa ajkdslkaj dlkasd kasdklj
    //#ENDIF
2)
    //#IF HI 
    a sjkalj dklajskl klsjd s
    //#ENDIF

并替换它们在开头添加//,产生一个字符串,如:

ajhsdkjad lkajsdkl a
 sadkjalksd  a lkjdsadk a
////#IF HI
////#as sjhdjakdj  jlkajs kja
//#sa ajkdslkaj dlkasd kasdklj
////#ENDIF
a djalk jskdj kls jdklsjd
////#IF HI 
//a sjkalj dklajskl klsjd s
////#ENDIF
a sjkldajdlkasksss

我尝试了以下正则表达式://#if HI(\ n |。)* //#endif 但是这会在一个组中选择整体。

感谢。

1 个答案:

答案 0 :(得分:1)

修改

如果这看起来很奇怪,请注意OP经过大量工作后,在飞行途中对请求做出了巨大的改变。最初的行不是以//开头,而是必须收到//。现在他们已经开始//了。新要求的答案在C和D的底部。

:一种。匹配群组

您可以使用这个简单的正则表达式(请参阅demo)来匹配一个块中的整个组:

(?s)#IF.*?#ENDIF

在Groovy中:

Matcher regexMatcher = subjectString =~ /(?s)#IF.*?#ENDIF/
if (regexMatcher.find()) {
    String ResultString = regexMatcher.group();
} 

解释正则表达式

(?s)                     # set flags for this block (with . matching
                         # \n) (case-sensitive) (with ^ and $
                         # matching normally) (matching whitespace
                         # and # normally)
#IF                      # '#IF'
.*?                      # any character (0 or more times (matching
                         # the least amount possible))
#ENDIF                   # '#ENDIF'

<强> B中。在每行的开头插入//

这里我们需要一种不同的方法,因为我们需要逐行定位输入。

您可以使用此功能(请参阅demo底部的替换内容):

String resultString = subjectString.replaceAll(/(?m)(#(?:END)?IF[^\r\n]*[\r\n]*|\G(?=(?:[^#]|#(?!IF))*#ENDIF)[^\r\n]*[\r\n]*)/, '//$1');

对于这个,请注意演示文稿右上方的正则表达式解释。

<强>℃。新要求:从//#IF//#ENDIF

的匹配

使用类似的东西:

def matchList = [];
Matcher regexMatcher = subjectString =~ '(?s)//#IF.*?//#ENDIF'
while (regexMatcher.find()) {
    matchList.add(regexMatcher.group());
} 

<强> d。新要求:当行已经以//

开头时的替换
String resultString = subjectString.replaceAll(/(?m)(\/\/#(?:END)?IF[^\r\n]*[\r\n]*|\G(?=(?:[^#]|#(?!IF))*#ENDIF)[^\r\n]*[\r\n]*)/, '//$1');