0

Preamble

I know (based on this question "No match found" when using Regex in Apex), that I can avoid "No Match Found" by wrapping the results in:

if(pm.matches()){
    //Code
}

However, this appears to be specific to when the Regex is a complete match to the string.


Scenario

I am trying to find a substring within the string(s), a set of numbers between parenthesis, like this (500). I want to return only the numbers inside the parenthesis, to store this number in a Salesforce number field.

I know I can use pm.find(), but it appears that if it does not find anything, it throws the "No Match Found" error instead of gracefully returning false, meaning I cannot do this:

if(pm.find()){
    // Code
}

The code above would still error when trying to do pm.find on a string with no results found.

ISSUE

I want to be able to put in any string and pull out the number IF one exists, but with this "No Match Found" issue I can't throw a string at it unless that string is guaranteed to have at least one set of numbers inside a parenthesis. Any string that has no numbers will throw the error. I considered putting this in a try{}catch{} block and just catching the errors gracefully, but this doesn't seem like the correct approach.

How can I work around this to be able to check any string but only set the number field in Salesforce in instances where a result is found in the string?


I've included some execute anonymous code below that shows a success and a failure, for reference:


SUCCESS

String str = 'Text Messaging Plan (500)';

Pattern p = Pattern.compile('.+\\((\\d+)');
Matcher pm = p.matcher(str);

System.debug('Find? ' + pm.find());
System.debug('PM Group 1: ' + pm.group(1));

FAILURE

String str = 'Text Messaging Plan (abc)';

Pattern p = Pattern.compile('.+\\((\\d+)');
Matcher pm = p.matcher(str);

System.debug('Find? ' + pm.find()); // FAILS HERE
System.debug('PM Group 1: ' + pm.group(1));
5

You're misreading the logs: the error in your "failure" code comes from calling Matcher.group (because there was no match).

Try the following:

String str = 'Text Messaging Plan (abc)';

Pattern p = Pattern.compile('.+\\((\\d+)');
Matcher pm = p.matcher(str);
Boolean found;

System.debug('Find? ' + (found = pm.find())); // (DOES NOT) FAIL HERE
if(found) {
    System.debug('PM Group 1: ' + pm.group(1));
}
1
  • thanks fox! I guess the wording of "StringException" had me thinking this was throwing an uncaught error Nov 20 '17 at 21:51

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.