Solved

Regex

Posted on 2011-09-18
18
321 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
How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

 

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

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

A year or so back I was asked to have a play with MongoDB; within half an hour I had downloaded (http://www.mongodb.org/downloads),  installed and started the daemon, and had a console window open. After an hour or two of playing at the command …
Introduction This article is the second of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article covers the basic installation and configuration of the test automation tools used by…
Viewers will learn about basic arrays, how to declare them, and how to use them. Introduction and definition: Declare an array and cover the syntax of declaring them: Initialize every index in the created array: Example/Features of a basic arr…
This tutorial explains how to use the VisualVM tool for the Java platform application. This video goes into detail on the Threads, Sampler, and Profiler tabs.

759 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

16 Experts available now in Live!

Get 1:1 Help Now