2014-02-19 67 views
0

我有一个文本,我需要提取两个特定单词之间的数据,例如活动:子活动:。这里是我的文字:找到两个特定单词之间的字符串

Activity: S1. Outline Design 
Sub-Activity: S3.3 Walk through Release Backlog 
Question Tag: tag 
Questioner (role or team): Solution Architect 
Which response should the user read first?: Response 8 
Responder 1 (role or team): Developer 
Response 1: 
Responder 2 (role or team): Scrum Master 
Response 2: response2 
Responder 3 (role or team): Please select: 
Response 3: 
Responder 4 (role or team): Please select: 
Response 4: 
Responder 5 (role or team): Please select: 
Response 5: 

,我想出了这个代码,但问题是,用于字这种模式,但只要我chaged它不工作了文本,任何人有任何想法:

private static String extractActivity(String text) { 
    Pattern pattern = Pattern.compile("(?:\\W|\\w)*Activity:(?:\\W)*(.*)(?:\\W)*Sub-Activity:(?:\\W|\\w)*", 
      Pattern.DOTALL); 
    Matcher matcher = pattern.matcher(text); 
    matcher.matches(); 
    String activities = matcher.group(1); 
    return activities; 
} 

它显示我以下错误:

Feb 19, 2014 5:06:58 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [default-dispatcher] in context with path [/webmi] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: No match found] with root cause 
java.lang.IllegalStateException: No match found 
    at java.util.regex.Matcher.group(Matcher.java:485) 
    at com.lloydsbanking.webmi.service.RSSReaderService.extractSubActivity(RSSReaderService.java:107) 
    at com.lloydsbanking.webmi.service.RSSReaderService.read(RSSReaderService.java:61) 
    at com.lloydsbanking.webmi.web.RssController.getFeed(RssController.java:34) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:920) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:827) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:801) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) 
    at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) 
    at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) 
    at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:394) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at com.lloydsbanking.webmi.web.VersionNumberFilter.doFilter(VersionNumberFilter.java:50) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129) 
    at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77) 
+0

如果更改文本,改变正则表达式匹配输入和您的要求。 – devnull

+1

你需要提供一些你喜欢从这个输入匹配的逻辑。 – anubhava

+0

我想阅读这两个词之间的所有内容。 – user261002

回答

1

表达是有点过头。对于整个字符串,也可以使用()而不是find()\\w匹配单词字符,而\\W匹配非单词字符。因此\\W|\\w可能是.

Pattern pattern = Pattern.compile("\\bActivity\\:(.*)\\bSub-Activity\\:", 
     Pattern.DOTALL); 
Matcher matcher = pattern.matcher(text); 
if (matcher.find()) { 
    String activities = matcher.group(1); 
    return activities; 
} 
throw new IllegalStateException("No activity in: " + text); 

我已经使用\\b用于在字边界,匹配/消耗0个字符,并检测字边界。这也适用于文本开头的Activity。 虽然我不确定,但我已经逃过冒号(:),但x:{2,3}会匹配xxxxx


正如@Pshemo所评论的,您的代码原则上是正确的。有可能数据没有到达。

变化

matcher.matches(); 

if (!matcher.matches)) { 
    throw new IllegalStateException("No activity in: " + text); 
} 
+0

这是很好的改进,但它似乎没有解决异常,因为正则表达式是用'(?:\\ W | \\ w)*'包围的,如果至少有一个匹配,它将让正则表达式匹配整个字符串。 – Pshemo

+0

这工作很好,非常感谢 – user261002

1

试试这个可以帮助你

public static void main(String[] args){ 
    String str = "Activity: S1. Outline Design Sub-Activity: S3.3 Walk through " + 
    "Release Backlog Question Tag: tag Questioner (role or team): Solution " + 
    "Architect Which response should the user read first?: Response 8 Responder" + 
    " 1 (role or team): Developer Response 1: Responder 2 (role or team): Scrum " + 
    "Master Response 2: response2 Responder 3 (role or team):"+ 
    "Please select: Response 3: Responder 4 (role or team): Please select: Response 4:" + 
    " Responder 5 (role or team): Please select: Response 5:"; 

    String regex = "(?<=Activity:).*?(?=Sub-Activity:)"; 

    Pattern pattern = Pattern.compile(regex); 
    Matcher matcher = pattern.matcher(str); 
    matcher.find(); 
    System.out.println(matcher.group()); 
} 
相关问题