Beefy Boxes and Bandwidth Generously Provided by pair Networks
Come for the quick hacks, stay for the epiphanies.
 
PerlMonks  

comment on

( [id://3333]=superdoc: print w/replies, xml ) Need Help??

Hmm, interesting problem.

1. I think you need to start with the assumption that the pattern is anchored at the start: /a/ might match "bbbbb..." as long as you throw an "a" in there at some point in the future, but /^a/ certainly cannot.

2. To get this directly out of the regexp engine you'd need to disable all its optimisations (and that's not something it is possible to do right now) - matching /^abcdef/ against "abc" will never read individual characters of the string, since an optimisation will see that the string is shorter than the minimum possible length before getting that far.

3. Defining what you want may become trickier with lookaheads: matching "abcd" =~ /^ab(?=.*foo)cd/ makes defining the "right" answer rather more difficult.

4. I think the definitions need some work in any case: "this is a substring of something that would match" will be difficult to know in general, and may be impossible in some cases. To offer a variant of crashtest's example: "ab" =~ /^abc(?<=d)/ is something that an unoptimised regexp engine might see as a prefix, even though no string actually matches the pattern.

Better, perhaps, would be to look for the longest prefix of the string that matches some prefix of the pattern. This might even be doable in perl5 - you'd need a function that takes a pattern and removes the last element, and then try a variety of prefixes of the string against each prefix of the pattern. Note that chomping /^\d{3}-\d{3}/ should give you /^\d{3}-\d{2}/, so it isn't entirely trivial, but as long as you're prepared to accept that the granularity might not always be perfect I think the code wouldn't be too bad even to cope with quite complex regular expresssions.

5. It is possible that at some point the perl5 regexp engine may become improved to the point that you can a) disable optimisations and b) provide some code for the "get next character in string" hook. This would allow you to achieve at least a variant of what you want with little pain, but I wouldn't hold your breath for the facilities.

6. It is likely this will be possible in perl6 before it is in perl5, since the perl6 authors have the benefit of starting from scratch with the lessons of perl5. You might want to get involved in that effort, at least enough to make clear what facilities you would want - but I think the facilities I suggest in (5) would be enough, and I'm pretty certain those are already planned.

Hugo


In reply to Re: Checking whether a string is a prefix of any string matching a given regular expression by hv
in thread Checking whether a string is a prefix of any string matching a given regular expression by dbrockman

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":



  • Are you posting in the right place? Check out Where do I post X? to know for sure.
  • Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
    <code> <a> <b> <big> <blockquote> <br /> <dd> <dl> <dt> <em> <font> <h1> <h2> <h3> <h4> <h5> <h6> <hr /> <i> <li> <nbsp> <ol> <p> <small> <strike> <strong> <sub> <sup> <table> <td> <th> <tr> <tt> <u> <ul>
  • Snippets of code should be wrapped in <code> tags not <pre> tags. In fact, <pre> tags should generally be avoided. If they must be used, extreme care should be taken to ensure that their contents do not have long lines (<70 chars), in order to prevent horizontal scrolling (and possible janitor intervention).
  • Want more info? How to link or How to display code and escape characters are good places to start.
Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chanting in the Monastery: (5)
As of 2024-04-25 11:40 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found