1

I need the below regex to select only those of total size X:

[[JN]*P?[JN]*]N

EDIT:

e.g. for 6:

  • JJPNNN -> JJPNNN
  • ONNJNNNO -> NNJNNN
  • NPJNJNN -> NPJNJN, PJNJNN
  • NPJNN -> False

I need it to capture the group.

4 Answers4

1

You can use lookahead to first check the length, like this:

(?=^.{6}$)[[JN]*P?[JN]*]N

Also, you seem to have too many brackets. To make the expression match your examples, you need to remove the outermost one:

(?=^.{6}$)[JN]*P?[JN]*N

Here is a small demo using ideone.

Keppil
  • 45,603
  • 8
  • 97
  • 119
0

You can use the size limiting

\{5,10}

something like that limits a size of 5~10

You should look up on it, there is tons of answered questions about this topic

Hesham Amer
  • 122
  • 1
  • 13
0
String test = "123456"
if(test.match("^\w{6,6}$")
{
  //True if String has length of 6
}   
Slash_FaKe
  • 26
  • 4
  • The OP wants a regex that will return true if it fits the pattern of `[JN]*P?[JN]*]N` **and** has a length of 6. Not one or the other. – bcsb1001 Aug 28 '14 at 09:04
0
public class Main {


    private static boolean match(String line) {
      Pattern p = Pattern.compile("^(?=[JNP]{6}$)[JN]*P?[JN]*N$");
      Matcher m = p.matcher(line);
      return m.matches();
    } 

    public static void main(String[] args) {

      System.out.println(match("JJPN"));
      System.out.println(match("JJPNNN"));
      System.out.println(match("NNJNNN"));
      System.out.println(match("NPJNJNN"));
      System.out.println(match("NPJNJNNNN"));

    }
}

out

false
true
true
false
false
slavik
  • 1,223
  • 15
  • 17