Solved

Regex

Posted on 2011-09-18
18
325 Views
Last Modified: 2012-05-12
how do you specify a pattern for

* space * & large

meaning any number of other characters before and after "space", followed by "large"
0
Comment
Question by:bhomass
  • 9
  • 6
  • 3
18 Comments
 
LVL 47

Expert Comment

by:for_yan
ID: 36557627
        Pattern p = Pattern.compile(".*space.*large");

        Matcher m1 = p.matcher("sdfsdfspace  large");

        if(m1.find())System.out.println("matched");

Open in new window


matched

Open in new window

0
 
LVL 35

Expert Comment

by:Terry Woods
ID: 36557641
Note for_yan's pattern still requires the 2 words to be on the same line. Did you want to capture or replace part of the string at all, or just detect that it matched
0
 
LVL 35

Expert Comment

by:Terry Woods
ID: 36557644
And are you working with Java, or Perl, or something else?
0
 
LVL 47

Expert Comment

by:for_yan
ID: 36557671

This is matcvhing even if there is end of line:
                             String sep = System.getProperty("line.separator");

     //  Pattern p = Pattern.compile(".*space.*large");
          Pattern p = Pattern.compile(".*space.*large", Pattern.DOTALL);

        Matcher m1 = p.matcher("sdf" +sep +  " sdfspace " + sep + "  large");

        if(m1.find())System.out.println("matched");

Open in new window


matched

Open in new window

0
 
LVL 47

Expert Comment

by:for_yan
ID: 36557687



Another way to specify that end of line should also be acceptable.
the code below works (when we use ("(?s:.*space.*large)") instead of ("(.*space.*large)") )
 ?s: is a "single-line mode" and this should work not only in Java - as opposed to Pattern.DOTALL which is obviously
Java specific
                             String sep = System.getProperty("line.separator");

      Pattern p = Pattern.compile("(?s:.*space.*large)");
        // p = Pattern.compile("(.*space.*large)");

         // Pattern p = Pattern.compile(".*space.*large", Pattern.DOTALL);

        Matcher m1 = p.matcher("sdf" +sep +  " sdfspace " + sep + "  large");

        if(m1.find())System.out.println("matched");

Open in new window


 matched 

Open in new window

0
 

Author Comment

by:bhomass
ID: 36557708
I follow for_yan almost all the way. please explain to me what is ?s:

I actually need this to be generally applicable, language independent, but I will test it out using java whenever possible.
0
 
LVL 47

Expert Comment

by:for_yan
ID: 36557711

The same thing but more informative output:

                             String sep = System.getProperty("line.separator");

      Pattern p = Pattern.compile("(?s:.*space.*large)");
        // p = Pattern.compile("(.*space.*large)");

         // Pattern p = Pattern.compile(".*space.*large", Pattern.DOTALL);

        Matcher m1 = p.matcher("sdf" +sep +  " sdfspace " + sep + "  large");

        if(m1.find())System.out.println(("sdf" +sep +  " sdfspace " + sep + "  large").substring(m1.start(),m1.end()));

Open in new window


Output:
sdf
 sdfspace 
  large

Open in new window

0
 
LVL 47

Expert Comment

by:for_yan
ID: 36557716
(?s:here your regex) - this ?s: means single-line mode which means that dot also matches new line charcter
0
 
LVL 47

Expert Comment

by:for_yan
ID: 36557717
but you should be careful - if those are many lines in the file - I guess in this single-line mode
it will match all lines before

0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 

Author Comment

by:bhomass
ID: 36557718
is there a way to specify the distance between "space" and large is less than 30 char?
0
 
LVL 35

Assisted Solution

by:Terry Woods
Terry Woods earned 100 total points
ID: 36557720
I haven't seen this syntax for the single-line pattern modifier before:
      Pattern p = Pattern.compile("(?s:.*space.*large)");
Does it just apply to the group it's in?

I'm more familiar with this:
      Pattern p = Pattern.compile("(?s).*space.*large");

And I see for_yan has just explained it, so I won't write any more!
0
 
LVL 47

Expert Comment

by:for_yan
ID: 36557723

Actually, I think this regex should be language indpendent - I don't think there is anything java specific here:
"(?s:.*space.*large)"
0
 
LVL 35

Expert Comment

by:Terry Woods
ID: 36557726
is there a way to specify the distance between "space" and large is less than 30 char?

Yes:
      Pattern p = Pattern.compile("(?s).*space.{0,29}large");
0
 
LVL 47

Accepted Solution

by:
for_yan earned 140 total points
ID: 36557727


 Pattern p = Pattern.compile("(?s:.*space.{1,30}large)");
0
 
LVL 35

Expert Comment

by:Terry Woods
ID: 36557728
And actually, the leading .* is redundant, so this would be fine too:

      Pattern p = Pattern.compile("(?s)space.{0,29}large");
0
 
LVL 47

Expert Comment

by:for_yan
ID: 36557730
Yes 0,29 iif you ewant strict and are ok witth no space
0
 
LVL 35

Expert Comment

by:Terry Woods
ID: 36557733
specify the distance between "space" and large is less than 30 char?
      Pattern p = Pattern.compile("(?s)space.{0,29}large");  // also allows no gap between the words
      Pattern p = Pattern.compile("(?s)space.{1,29}large");

specify the distance between "space" and large is less than or equal to 30 char?
      Pattern p = Pattern.compile("(?s)space.{0,30}large");  // also allows no gap between the words
      Pattern p = Pattern.compile("(?s)space.{1,30}large");
0
 

Author Comment

by:bhomass
ID: 36557740
great answers
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

In this post we will learn how to connect and configure Android Device (Smartphone etc.) with Android Studio. After that we will run a simple Hello World Program.
Basic understanding on "OO- Object Orientation" is needed for designing a logical solution to solve a problem. Basic OOAD is a prerequisite for a coder to ensure that they follow the basic design of OO. This would help developers to understand the b…
Video by: Michael
Viewers learn about how to reduce the potential repetitiveness of coding in main by developing methods to perform specific tasks for their program. Additionally, objects are introduced for the purpose of learning how to call methods in Java. Define …
The viewer will learn how to implement Singleton Design Pattern in Java.

910 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

23 Experts available now in Live!

Get 1:1 Help Now