Have a look at this: http://www.boost.org/doc/libs/1_44_0/libs/regex/doc/html/boost_regex/configuration/algorithm.html
The existence of a recursive / non-recursive difference is a pretty strong assumption that BOOST is not necessarily a discrete linear state machine. Therefore, there are good chances that you can do better for your specific problem.
The best answer depends on how many haystacks you have and the minimum needle size. If the smallest needle is longer than a few characters, you can do a little better than a generalized regular expression library.
Basically, all line searches work by testing for matching at the current position (cursor), and if none are found, try again when the cursor moves further to the right.
Rabin-Karp creates DFSM from the line (or lines) for which you are looking for the test and cursor movement to be combined into a single operation. However, Rabin-Karp was originally designed for one needle, so you would need to support a pullback if one match could be a suitable prefix for another. (Remember that when you want to reuse your code.)
Another tactic is to slide the cursor more than one character to the right, if at all possible. Boyer Moore does it. Usually it is designed for one needle. Build a table of all the characters and the rightmost position that they appear in the needle (if at all). Now set the cursor to len (needle) -1. The entry in the table indicates (a) what offset to the left of the cursor that can be found by the needle, or (b) that you can move the cursor len (needle) further to the right.
When you have more than one needle, the design and use of your table becomes more complex, but it can still save you an order of magnitude in probes. You can still do DFSM, but instead of calling the general search method, you call do_this_DFSM_match_at_this_offset ().
Another tactic is testing more than 8 bits at a time. There is a spam killer that looks at 32-bit machine words at a time. He then makes some simple hash code to match the 12-bit result, and then looks through the table to see if there is any damage. You have four entries for each pattern (offsets 0, 1, 2, and 3 from the beginning of the pattern), and then this method, despite the thousands of patterns in the table, they check only one or two per 32-bit word in the subject line.
So, in general, yes, you can go faster than regular expressions WHEN NEEDLES ARE CONSTANT.