Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add regex match iterator #2109

Merged
merged 5 commits into from
Aug 2, 2017
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions packages/regex/_test.pony
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ actor Main is TestList
test(_TestApply)
test(_TestGroups)
test(_TestEq)
test(_TestMatchIterator)
test(_TestMatchIteratorEmpty)
test(_TestSplit)
test(_TestError)

Expand Down Expand Up @@ -61,6 +63,43 @@ class iso _TestEq is UnitTest
h.assert_true(r == "1234", """ \d+ =~ "1234" """)
h.assert_true(r != "asdf", """ \d+ !~ "asdf" """)

class iso _TestMatchIterator is UnitTest
"""
Tests the match iterator
"""
fun name(): String => "regex/Regex.matches"

fun apply(h: TestHelper) ? =>
let r = Regex("([+-]?\\s*\\d+[dD]\\d+|[+-]?\\s*\\d+)")?
let matches = r.matches("9d6+4d20+30-5d5+12-60")

let m1 = matches.next()?
h.assert_eq[String](m1(0)?, "9d6")
let m2 = matches.next()?
h.assert_eq[String](m2(0)?, "+4d20")
let m3 = matches.next()?
h.assert_eq[String](m3(0)?, "+30")
let m4 = matches.next()?
h.assert_eq[String](m4(0)?, "-5d5")
let m5 = matches.next()?
h.assert_eq[String](m5(0)?, "+12")
let m6 = matches.next()?
h.assert_eq[String](m6(0)?, "-60")
h.assert_false(matches.has_next())

class iso _TestMatchIteratorEmpty is UnitTest
"""
Tests the match iterator when the subject doesn't contain any matches
for the regular expression
"""
fun name(): String => "regex/Regex.matches/nomatch"

fun apply(h: TestHelper) ? =>
let r = Regex("([+-]?\\s*\\d+[dD]\\d+|[+-]?\\s*\\d+)")?
let matches = r.matches("nevergonnaletyoudown")

h.assert_false(matches.has_next())

class iso _TestSplit is UnitTest
"""
Tests split.
Expand Down
39 changes: 39 additions & 0 deletions packages/regex/match_iterator.pony
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
class MatchIterator is Iterator[Match]
"""
MatchIterator allows for calling code to repeatedly perform the same match
against a subject string as an iterator. This lets callers repeat the match
until no more matches exist.
"""
let _regex: Regex box
let _subject: String
var _offset: USize = 0

new create(regex': Regex box, subject': String, offset': USize = 0) =>
"""
Creates a new Match Iterator from a regular expression and a subject
string.
"""
_regex = regex'
_subject = consume subject'
_offset = offset'

fun has_next() : Bool =>
"""
Indicates whether there is another match available.
"""
try
let m = _regex(_subject, _offset)?
true
else
false
end

fun ref next(): Match ? =>
"""
Yields the next match to the regular expression or produces
an error if there is no match.
"""
let m = _regex(_subject, _offset)?
_offset = m.end_pos() + 1
m

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This little symbol on GitHub is indicating that this file is missing an empty line at the end of it.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see the little symbol, and there is a line at the end of the file.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's odd - it may be indicating that there is extra whitespace on the line at the end of the file?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It means "there's no newline at the end of the file".

7 changes: 7 additions & 0 deletions packages/regex/regex.pony
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,13 @@ class Regex

_jit = jit and (@pcre2_jit_compile_8[I32](_pattern, U32(1)) == 0)

fun matches(subject: String): MatchIterator =>
"""
Creates a match iterator from the regular expression that will iterate
over the supplied subject returning matches
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could you add a period at the end of this sentence?

"""
MatchIterator(this, subject)

fun eq(subject: ByteSeq box): Bool =>
"""
Return true on a successful match, false otherwise.
Expand Down