class StringScanner
Overview
StringScanner
provides for lexical scanning operations on a String.
Example
require "string_scanner"
s = StringScanner.new("This is an example string")
s.eos? # => false
s.scan(/\w+/) # => "This"
s.scan(/\w+/) # => nil
s.scan(/\s+/) # => " "
s.scan(/\s+/) # => nil
s.scan(/\w+/) # => "is"
s.eos? # => false
s.scan(/\s+/) # => " "
s.scan(/\w+/) # => "an"
s.scan(/\s+/) # => " "
s.scan(/\w+/) # => "example"
s.scan(/\s+/) # => " "
s.scan(/\w+/) # => "string"
s.eos? # => true
s.scan(/\s+/) # => nil
s.scan(/\w+/) # => nil
Scanning a string means remembering the position of a scan offset, which is just an index. Scanning moves the offset forward, and matches are sought after the offset; usually immediately after it.
Method Categories
Methods that advance the scan offset:
Methods that look ahead:
- `#peek'
- `#check'
- `#check_until'
Methods that deal with the position of the offset:
Methods that deal with the last match:
Miscellaneous methods:
Defined in:
string_scanner.crClass Method Summary
Instance Method Summary
-
#[](n)
Returns the
n
-th subgroup in the most recent match. -
#[]?(n)
Returns the nilable
n
-th subgroup in the most recent match. -
#check(pattern)
Returns the value that
#scan
would return, without advancing the scan offset. -
#check_until(pattern)
Returns the value that
#scan_until
would return, without advancing the scan offset. -
#eos?
Returns true if the scan offset is at the end of the string.
-
#inspect(io : IO)
Writes a representation of the scanner.
-
#offset
Returns the current position of the scan offset.
-
#offset=(position : Int)
Sets the position of the scan offset.
-
#peek(len)
Extracts a string corresponding to string[offset,
len
], without advancing the scan offset. -
#reset
Resets the scan offset to the beginning and clears the last match.
-
#rest
Returns the remainder of the string after the scan offset.
-
#scan(pattern)
Tries to match with
pattern
at the current position. -
#scan_until(pattern)
Scans the string until the
pattern
is matched. -
#skip(pattern)
Attempts to skip over the given
pattern
beginning with the scan offset. -
#skip_until(pattern)
Attempts to skip until the given
pattern
is found after the scan offset. -
#string : String
Returns the string being scanned.
-
#terminate
Moves the scan offset to the end of the string and clears the last match.
Instance methods inherited from class Reference
==(other)==(other : self) ==, hash hash, inspect(io : IO) : Nil inspect, object_id : UInt64 object_id, same?(other : Reference)
same?(other : Nil) same?, to_s(io : IO) : Nil to_s
Instance methods inherited from class Object
!=(other)
!=,
!~(other)
!~,
==(other)
==,
===(other)===(other : YAML::Any)
===(other : JSON::Any) ===, =~(other) =~, class class, clone clone, crystal_type_id crystal_type_id, dup dup, hash hash, inspect
inspect(io : IO) inspect, itself itself, not_nil! not_nil!, tap(&block) tap, to_json to_json, to_pretty_json(io : IO)
to_pretty_json to_pretty_json, to_s
to_s(io : IO) to_s, to_yaml(io : IO)
to_yaml to_yaml, try(&block) try
Class methods inherited from class Object
==(other : Class)
==,
===(other)
===,
cast(other) : self
cast,
from_json(string_or_io) : self
from_json,
from_yaml(string : String) : self
from_yaml,
hash
hash,
inspect(io)
inspect,
name : String
name,
to_s(io)
to_s,
|(other : U.class)
|
Class Method Detail
Instance Method Detail
Returns the n
-th subgroup in the most recent match.
Raises an exception if there was no last match or if there is no subgroup.
s = StringScanner.new("Fri Dec 12 1975 14:39")
regex = /(?<wday>\w+) (?<month>\w+) (?<day>\d+)/
s.scan(regex) # => "Fri Dec 12"
s[0] # => "Fri Dec 12"
s[1] # => "Fri"
s[2] # => "Dec"
s[3] # => "12"
s["wday"] # => "Fri"
s["month"] # => "Dec"
s["day"] # => "12"
Returns the nilable n
-th subgroup in the most recent match.
Returns nil
if there was no last match or if there is no subgroup.
s = StringScanner.new("Fri Dec 12 1975 14:39")
regex = /(?<wday>\w+) (?<month>\w+) (?<day>\d+)/
s.scan(regex) # => "Fri Dec 12"
s[0]? # => "Fri Dec 12"
s[1]? # => "Fri"
s[2]? # => "Dec"
s[3]? # => "12"
s[4]? # => nil
s["wday"]? # => "Fri"
s["month"]? # => "Dec"
s["day"]? # => "12"
s["year"]? # => nil
s.scan(/more/) # => nil
s[0]? # => nil
Returns the value that #scan
would return, without advancing the scan
offset. The last match is still saved, however.
s = StringScanner.new("this is a string")
s.offset = 5
s.check(/\w+/) # => "is"
s.check(/\w+/) # => "is"
Returns the value that #scan_until
would return, without advancing the
scan offset. The last match is still saved, however.
s = StringScanner.new("test string")
s.check_until(/tr/) # => "test str"
s.check_until(/g/) # => "test string"
Returns true if the scan offset is at the end of the string.
s = StringScanner.new("this is a string")
s.eos? # => false
s.scan(/(\w+\s?){4}/) # => "this is a string"
s.eos? # => true
Writes a representation of the scanner.
Includes the current position of the offset, the total size of the string, and five characters near the current position.
Extracts a string corresponding to string[offset,len
], without advancing
the scan offset.
Returns the remainder of the string after the scan offset.
s = StringScanner.new("this is a string")
s.scan(/(\w+\s?){2}/) # => "this is "
s.rest # => "a string"
Tries to match with pattern
at the current position. If there's a match,
the scanner advances the scan offset, the last match is saved, and it
returns the matched string. Otherwise, the scanner returns nil.
s = StringScanner.new("test string")
s.scan(/\w+/) # => "test"
s.scan(/\w+/) # => nil
s.scan(/\s\w+/) # => " string"
s.scan(/.*/) # => nil
Scans the string until the pattern
is matched. Returns the substring up
to and including the end of the match, the last match is saved, and
advances the scan offset. Returns nil
if no match.
s = StringScanner.new("test string")
s.scan_until(/tr/) # => "test str"
s.scan_until(/tr/) # => nil
s.scan_until(/g/) # => "ing"
Attempts to skip over the given pattern
beginning with the scan offset.
In other words, the pattern is not anchored to the current scan offset.
If there's a match, the scanner advances the scan offset, the last match is
saved, and it returns the size of the skipped match. Otherwise it returns
nil
and does not
advance the offset.
This method is the same as #scan
, but without returning the matched
string.
Attempts to skip until the given pattern
is found after the scan
offset. In other words, the pattern is not anchored to the current scan
offset.
If there's a match, the scanner advances the scan offset, the last match is
saved, and it returns the size of the skip. Otherwise it returns nil
and does not advance the
offset.
This method is the same as #scan_until
, but without returning the matched
string.