2

I have 35+ words that I need to search for within a string. If the string ENDS with any of the 35+ words then I need to remove them. I am using .removeEnd() and it works great. My issue is my method below only handles one word at a time and I feel like there has got to be a DRY way of writing this method to check for all 35+ words. Does anyone have any suggestions other then regex? I would like to continue to use APEX.

if (Trigger.new[0].Legal_Name_Normal__c.endsWith(' limited liability company')) {
    String replacement = 'limited liability company';
    newLegal = Trigger.new[0].Legal_Name_Normal__c.removeEnd(replacement); 
    Trigger.new[0].Legal_Name_Normal__c = newLegal;
}

My initial thought was to do an OR statement but if I did that, I am not sure how to target each item and save it into the replacement variable. My guess is I would have to save each word in its own String and then write a conditional around newLegal = Trigger.new[0].Legal_Name_Normal__c.removeEnd(replacement);

Does this seem like the best route?

2 Answers 2

6

This is a great use case for Regular Expressions. One benefit is you can make it case insensitive just by adding (?i) to the beginning of your expression.

List<String> substrings = new List<String>
{
    'limited liability company',
    'some other value',
    'etc.'
};
String expression = '(?i)(' + substrings.join('|') + ')$';
// this expression uses an or join to match any single expression
// followed by the end of the string

// without this terminating $, the expression would be equivalent to
// checking contains, rather than ends with

for (MyObject__c record : trigger.new)
{
    if (record.Legal_Name_Normal__c != null)
    {
        record.Legal_Name_Normal__c = record.Legal_Name_Normal__c.replaceAll(expression, '');
    }
}
1
  • 2
    I normally love to quote Jamie Zawinski in situations involving regexp, but this really is one of the situations where a regexp is not only good, it's the right tool for the job.
    – Derek F
    Oct 24, 2017 at 19:03
5

Use may choose to use String.replaceAll:

String keywordRegex = '(LLC|Inc\\.|Limited Liability Company|\\.com)$';
for( **SomeType** record: Trigger.new) {
    if(record.Legal_Name_Normal__c != null) {
        record.Legal_Name_Normal__c = record.Legal_Name_Normal__c.replaceAll(keywordRegex,'');
    }
}

This will perform a regex against any number of values (separated by the | for "OR" logic), and the "$" at the end matches only at the end of the string.

5
  • Haha, well that's near verbatim.
    – Adrian Larson
    Oct 24, 2017 at 18:30
  • @AdrianLarson You know what they say about great minds, lol.
    – sfdcfox
    Oct 24, 2017 at 18:30
  • @sfdcfox and Adrian- great suggestions. I figured regex would be the easiest with this many records, I was just hoping for a way to do it with APEX methods. I didn't clearly explain the requirements, I just updated them. It is if the string ends with the word. which is why I chose removeEnd(). I am sure I can still specify this with regex.
    – Olivia
    Oct 24, 2017 at 18:38
  • Oh and I just read the end of your answer. You've got the end result covered! Thank you
    – Olivia
    Oct 24, 2017 at 18:40
  • 1
    @Olivia Yes, you could use removeEnd, but it's inefficient compared to a single replaceAll. You might want to take some time to learn how regex works, because it can turn really complicated logic into really simple logic.
    – sfdcfox
    Oct 24, 2017 at 18:53

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.