正则表达式的模式如下:
Pattern p = Pattern.compile("[^\\.](?s)executeRule\\(\\s*?(.+?),\\s*?('.+?'),\\s*(\\[.+?\\]\\s*\\);)");我有一个类似这样的文本:
setSomething(false);
executeRule(document, 'PublishDocumentsToEmail', [
'xmlMapping':'xmlmapping.TagRegLike',
'emailAddress':'EMAIL(mymail@mail.com)',
'emailSubject':'Test',
'emailText':'test',
'filenameSuffix':'test']
);
System.out.println("bla");
executeRule(document, 'PublishDocumentsToJMS', [
'xmlMapping':'xmlmapping.TagRegLike',
'emailAddress':'EMAIL(mymail@mail.com)',
'emailSubject':'Test',
'emailText':'test',
'filenameSuffix':'test']
);我想找到包含executeRule模式的序列。我的正则表达式只成功地找到了出现的第一个模式;这个第一个模式之后的所有模式都将包含前面的模式。
例如,我第一次分析时发现
executeRule(document, 'PublishDocumentsToEmail', [
'xmlMapping':'xmlmapping.TagRegLike',
'emailAddress':'EMAIL(mymail@mail.com)',
'emailSubject':'Test',
'emailText':'test',
'filenameSuffix':'test']
);我在模式上做了一些替换,这样它就变成了
executeRule(document, 'PublishDocumentsToEmail', [
'xmlMapping':'xmlmapping.TagRegLike',
'emailAddress':'EMAIL(mymail@mail.com)',
'emailSubject':'Test',
'emailText':'test',
'filenameSuffix':'test']
,crs
);之后,我递归地调用具有新文本的相同解析方法,即
setSomething(false);
executeRule(document, 'PublishDocumentsToEmail', [
'xmlMapping':'xmlmapping.TagRegLike',
'emailAddress':'EMAIL(mymail@mail.com)',
'emailSubject':'Test',
'emailText':'test',
'filenameSuffix':'test']
,crs
);
System.out.println("bla");
executeRule(document, 'PublishDocumentsToJMS', [
'xmlMapping':'xmlmapping.TagRegLike',
'emailAddress':'EMAIL(mymail@mail.com)',
'emailSubject':'Test',
'emailText':'test',
'filenameSuffix':'test']
);并且我的regexp将匹配来自
executeRule(document, 'PublishDocumentsToEmail', [
'xmlMapping':'xmlmapping.TagRegLike',
'emailAddress':'EMAIL(mymail@mail.com)',
'emailSubject':'Test',
'emailText':'test',
'filenameSuffix':'test']
,crs
);
System.out.println("bla");
executeRule(document, 'PublishDocumentsToJMS', [
'xmlMapping':'xmlmapping.TagRegLike',
'emailAddress':'EMAIL(mymail@mail.com)',
'emailSubject':'Test',
'emailText':'test',
'filenameSuffix':'test']
);我怎样才能让它只匹配我的第二个模式?
Thx
发布于 2011-11-14 21:08:29
我没有仔细阅读您的示例,但是您可以在模式中使用\G在最后一次匹配之后开始,或者在使用Matcher#find()时循环遍历匹配。
希望这能有所帮助。
更新
之后,我递归地调用与新文本相同的解析方法,这是...
为什么要递归地调用它呢?我没有看到任何递归,所以您可以只迭代在第一个调用中找到的匹配项。
发布于 2011-11-14 21:08:26
只需在index位于第一个/已修改的事件之后的位置使用find(index)。
Matcher.find(int)
发布于 2011-11-14 21:53:53
这就是您要做的全部工作吗?将,crs添加为具有相同结构的所有executeRule字符串的最后一行吗?这很简单:
s = s.replaceAll("(?m)^executeRule\\([^\\[]*\\[(\\s*)[^\\]]*\\]", "$0$1,crs");我只是将所有内容都与结束的]进行了匹配(在此过程中捕获了一些前导空格的样本),然后重新插入并添加了,crs行。如果你的需求比这更复杂,你需要告诉我们它们到底是什么。但我相信会有更好的解决方案,而不是像您现在这样对输入进行多次传递。
https://stackoverflow.com/questions/8122008
复制相似问题