我有以下文字:
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 但是这会在一个组中选择整体。
感谢。
答案 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');