首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Regexp discussion2

Java Regexp discussion2
EN

Stack Overflow用户
提问于 2011-11-14 21:02:24
回答 3查看 79关注 0票数 0

正则表达式的模式如下:

代码语言:javascript
复制
Pattern p = Pattern.compile("[^\\.](?s)executeRule\\(\\s*?(.+?),\\s*?('.+?'),\\s*(\\[.+?\\]\\s*\\);)");

我有一个类似这样的文本:

代码语言:javascript
复制
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模式的序列。我的正则表达式只成功地找到了出现的第一个模式;这个第一个模式之后的所有模式都将包含前面的模式。

例如,我第一次分析时发现

代码语言:javascript
复制
executeRule(document, 'PublishDocumentsToEmail', [
    'xmlMapping':'xmlmapping.TagRegLike',
    'emailAddress':'EMAIL(mymail@mail.com)',
    'emailSubject':'Test',
    'emailText':'test',
    'filenameSuffix':'test']
);

我在模式上做了一些替换,这样它就变成了

代码语言:javascript
复制
executeRule(document, 'PublishDocumentsToEmail', [
        'xmlMapping':'xmlmapping.TagRegLike',
        'emailAddress':'EMAIL(mymail@mail.com)',
        'emailSubject':'Test',
        'emailText':'test',
        'filenameSuffix':'test']
         ,crs
    );

之后,我递归地调用具有新文本的相同解析方法,即

代码语言:javascript
复制
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将匹配来自

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-14 21:08:29

我没有仔细阅读您的示例,但是您可以在模式中使用\G在最后一次匹配之后开始,或者在使用Matcher#find()时循环遍历匹配。

希望这能有所帮助。

更新

之后,我递归地调用与新文本相同的解析方法,这是...

为什么要递归地调用它呢?我没有看到任何递归,所以您可以只迭代在第一个调用中找到的匹配项。

票数 1
EN

Stack Overflow用户

发布于 2011-11-14 21:08:26

只需在index位于第一个/已修改的事件之后的位置使用find(index)

Matcher.find(int)

票数 0
EN

Stack Overflow用户

发布于 2011-11-14 21:53:53

这就是您要做的全部工作吗?将,crs添加为具有相同结构的所有executeRule字符串的最后一行吗?这很简单:

代码语言:javascript
复制
s = s.replaceAll("(?m)^executeRule\\([^\\[]*\\[(\\s*)[^\\]]*\\]", "$0$1,crs");

我只是将所有内容都与结束的]进行了匹配(在此过程中捕获了一些前导空格的样本),然后重新插入并添加了,crs行。如果你的需求比这更复杂,你需要告诉我们它们到底是什么。但我相信会有更好的解决方案,而不是像您现在这样对输入进行多次传递。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8122008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档