English 中文(简体)
Regex starting with a zero length line and continuing across lines in Java
原标题:

I want to match the following: a zero length line, with the match continuing across lines of non-zero length until a particular string is matched in a line. E.g: the match starts with a zero length line and continues until STOP is reached:

Some random text I don t care about

The match starts at the beginning of this line
The match continues across this line
The match stops here STOP more
text I don t care about

Any suggestions?

Thanks

最佳回答

This should do it:

(?ms)^[ 	]*+$s*+((?:(?!STOP).)*+)

A little demo:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main { 
    public static void main(String[] args) {
        String text = "Some random text I don t care about"      + "
" +
                ""                                               + "
" +
                "The match starts at the beginning of this line" + "
" +
                "The match continues across this line"           + "
" +
                "The match stops here STOP more"                 + "
" +
                "don t care about"                               + "
" +
                ""                                               + "
" +
                ""                                               + "
" +
                ""                                               + "
" +
                "foo"                                            + "
" +
                "barSTOP"                                        + "
" +
                "text I don t care about";
        Matcher m = Pattern.compile("(?ms)^[ 	]*+$\s*+(?:(?!STOP).)*+").matcher(text);
        while(m.find()) {
            System.out.println("match ->"+m.group()+"<-");
        }
    }
}

which will output:

match ->
The match starts at the beginning of this line
The match continues across this line
The match stops here <-
match ->


foo
bar<-

A small explanation:

(?ms)               # enable mutli-line and dot-all
^[ 	]*+$           # match and empty line
s*+                # match the line break
(                   # start group 1
  (?:(?!STOP).)     #   if the string  STOP  cannot be seen, match any character
  *+                #   match the previous zero or more times (possessively)
)                   # stop group 1
问题回答

Making sure you set the "match multi-line" flag, the expression is "\n(\n.*STOP)". The first (and only) match group yields your result. On DOS and windows systems use "\r\n" in place of "\n".

(?ms)^$(.+)STOP




相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签