Joe
Joe

Reputation: 23

Looking for A Regular expression to match java regex (punct) pattern

I am looking for help/support for a Regex expression which will match studentIdMatch2 value in below class. studentIdMatch1 matches fine.However the studentIdMatch2 has studentId which can allow all the special characters other than : and ^ and comma.Hence its not working,thank you for your time and appreciate your support.

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

public class TestRegEx {
    public static void main(String args[]){

       String studentIdMatch1 = "studentName:harry,^studentId:Id123";
       String studentIdMatch2 = "studentName:harry,^studentId:Id-H/MPU/L&T/OA+_T/(1490)/17@)123";
       Pattern pattern = Pattern
                .compile("(\\p{Punct}?)(\\w+?)(:)(\\p{Punct}?)(\\w+?)(\\p{Punct}?),");
        Matcher matcher = pattern.matcher(studentIdMatch1 + ","); // Works Fine(Matches Student Name and Id)
                                                                        // No Special Characters in StudentId
        //Matcher matcher = pattern.matcher(studentIdMatch2 + ","); //Wont work Special Characters in StudentId. Matches Student Name
        while (matcher.find()) {
            System.out.println("group1 = "+matcher.group(1)+ "group2 = "+matcher.group(2) +"group3 = "+matcher.group(3) +"group4 = "+matcher.group(4)+"group5 = "+matcher.group(5));
        }
        System.out.println("match ended");

    }
}

Upvotes: 0

Views: 162

Answers (2)

user7571182
user7571182

Reputation:

You may try:

^SutdentName:(\w+),\^StudenId:([^\s,^:]+)$

Explanation of the above regex:

  • ^, $ - Represents start and end of line respectively.
  • SutdentName: - Matches SutdentName: literally. Although according to me it should be StudentName; but I didn't changed it.
  • (\w+) - Represents first capturing group matching only word characters i.e. [A-Za-z0-9_] one or more times greedily.
  • ,\^StudenId: - Matches ,^StudenId literally. Here also I guess it should be StudentId.
  • ([^\s,^:]+) - Represents second capturing group matching everything other than white-space, ,, ^ and : one or more times greedily. You can add others according to your requirements.

Pictorial Representation

You can find the demo of the above regex in here.

Sample Implementation in java:

import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Main
{
    private static final Pattern pattern = Pattern.compile("^SutdentName:(\\w+),\\^StudenId:([^\\s,^:]+)$", Pattern.MULTILINE);
    public static void main(String[] args) {
        
        String string = "SutdentName:harry,^StudenId:Id123\n"
     + "SutdentName:harry,^StudenId:Id-H/MNK/U&T/BA+_T/(1490)/17@)123";
     Matcher matcher = pattern.matcher(string);
     while(matcher.find()){
         System.out.println(matcher.group(1) + " " + matcher.group(2));
     }
    }
}

You can find the sample run of the above code in here.

Upvotes: 1

Alanpatchi
Alanpatchi

Reputation: 1199

The second (\\w+?) only captures words. So change it to capture what you want. i.e

allow all the special characters other than : and ^ and comma

like ([^:^,]+?)

  • ^ - Negate the match
  • :^, - Matches : , ^ and comma

Upvotes: 0

Related Questions