5

I use Rubular to test my regular expressions, when I need them. I am having a bit of trouble crafting an expression that will work for me. For reference, I am trying to match multiple substrings in any order. My problem, however, is that I cannot get the dot (.) character to match newline characters.

I learned here that you can merge in options at the beginning of an expression using (?[options]), so I assumed (?m) would help me here. However, it does not seem to work:

Pattern keyword = Pattern.compile('(?mi)(?=.*\\bjack\\b)(?=.*\\bjill\\b)');
system.debug(keyword.pattern()); //(?mi)(?=.*\bjack\b)(?=.*\bjill\b)

system.assert(keyword.matcher('jack n jill').find(); // works
system.assert(keyword.matcher('jill n jack').find(); // works
system.assert(keyword.matcher('Jack n Jill').find(); // works
system.assert(keyword.matcher('jack \n jill').find(); // fail

However, it seems to me that this approach should work.

1 Answer 1

6

Different languages use different flags to control inline behavior. I gather that Ruby uses m to make dot match newline, but in Apex (and most other languages too, I think) you would want to use the s modifier flag to get this behavior.

Many languages use m to mean multi-line: The ^ and $ anchors now match at the beginning/end of each line respectively, instead of beginning/end of the entire string.
and s to mean single-line: The dot (.) metacharacter will with this flag enabled also match new lines.

Btw, my personal favorite Regex tester is Regex101

4
  • Interesting. Just curious, do you have a reference to back this up? That would make this answer more helpful for me, and more credible too!
    – Adrian Larson
    Mar 15, 2016 at 16:52
  • I just added a link to the online regex tester that I use, which includes descriptions of all modifier flags Mar 15, 2016 at 16:54
  • Wow, I'd give you another +1 just for the link if I could. Amazing tool. Already bookmarked.
    – Adrian Larson
    Mar 15, 2016 at 16:57
  • 1
    Note: You'll want to read the Pattern Java documentation, upon which Apex Code runs under. s enables the DOTALL flag (which allows . to match newline characters), while m only alters the effect of ^ and $ at the beginning/end of the line.
    – sfdcfox
    Mar 15, 2016 at 19:11

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .