// include the latest version of the regex crate in your Cargo.toml
extern crate regex;
use regex::Regex;
fn main() {
let regex = Regex::new(r#"(?m)"\$(G[ABILNPQ][A-Z]{3}(?:,(?:\d+(?:\.\d+)?|[a-zA-Z]+|))*,\w*\*[\dA-Fa-f]{2})""#).unwrap();
let string = "BOOST_AUTO_TEST_CASE(ValidOneField)
{
BOOST_CHECK(isSingleSentence(\"$GPXXX,1*23\"));
}
BOOST_AUTO_TEST_CASE(ValidTwoFields)
{
BOOST_CHECK(isSingleSentence(\"$GPXXX,1,testing*69\"));
}
BOOST_AUTO_TEST_CASE(ValidEmptyField)
{
BOOST_CHECK(isSingleSentence(\"$GPXXX,*47\"));
}
BOOST_AUTO_TEST_CASE(ValidManyFields)
{
const std::string commas(1000, ','); // 1000 fields
BOOST_CHECK(isSingleSentence(\"$GPXXX\" + commas + \"*28\"));
}
BOOST_AUTO_TEST_CASE(ValidEdgeLetters)
{
BOOST_CHECK(isSingleSentence(\"$GPAAA,1*23\"));
BOOST_CHECK(isSingleSentence(\"$GPZZZ,1*23\"));
}
BOOST_AUTO_TEST_CASE(ValidEdgeHexDecimalDigits)
{
BOOST_CHECK(isSingleSentence(\"$GPXXX,1*09\"));
BOOST_CHECK(isSingleSentence(\"$GPXXX,1*90\"));
}
BOOST_AUTO_TEST_CASE(ValidLowercaseHexCharacters)
{
BOOST_CHECK(isSingleSentence(\"$GPXXX,*ce\"));
}
BOOST_AUTO_TEST_CASE(ValidUppercaseHexCharacters)
{
BOOST_CHECK(isSingleSentence(\"$GPXXX,*DB\"));
}
BOOST_AUTO_TEST_CASE(ValidHexCharactersMix)
{
BOOST_CHECK(isSingleSentence(\"$GPXXX,*b6\"));
BOOST_CHECK(isSingleSentence(\"$GPXXX,*3E\"));
BOOST_CHECK(isSingleSentence(\"$GPXXX,*cD\"));
}
BOOST_AUTO_TEST_CASE(ValidEdgeHexDigits)
{
BOOST_CHECK(isSingleSentence(\"$GPXXX,*af\"));
BOOST_CHECK(isSingleSentence(\"$GPXXX,*FA\"));
}
BOOST_AUTO_TEST_CASE(ValidTypicalSentences)
{
BOOST_CHECK(isSingleSentence(\"$GPGLL,5425.31,N,107.03,W,82610*69\"));
BOOST_CHECK(isSingleSentence(\"$GPWPL,5128.62,N,00027.58,W,EGLL*59\"));
BOOST_CHECK(isSingleSentence(\"$GPRMC,113922.000,A,3722.5993,N,00559.2458,W,0.000,0.00,150914,,A*62\"));
BOOST_CHECK(isSingleSentence(\"$GPGGA,113922.000,3722.5993,N,00559.2458,W,1,0,,4.0,M,,M,,*40\"));
BOOST_CHECK(isSingleSentence(\"$GPMSS,55,27,318.0,100,*66\"));
}
BOOST_AUTO_TEST_CASE(ValidTransmitterOtherThanGP)
{ // GP: GPS
BOOST_CHECK(isSingleSentence(\"$GLXXX,1*23\")); // GL: GLONASS
BOOST_CHECK(isSingleSentence(\"$GAXXX,1*23\")); // GA: Galileo
BOOST_CHECK(isSingleSentence(\"$GBXXX,1*23\")); // GB: BeiDou
BOOST_CHECK(isSingleSentence(\"$GIXXX,1*23\")); // GA: NavIC
BOOST_CHECK(isSingleSentence(\"$GQXXX,1*23\")); // GB: QZSS
BOOST_CHECK(isSingleSentence(\"$GNXXX,1*23\")); // GN: combined
}
BOOST_AUTO_TEST_CASE(InvalidMissingSuffix)
{
BOOST_CHECK(!isSingleSentence(\"\"));
BOOST_CHECK(!isSingleSentence(\"$\"));
BOOST_CHECK(!isSingleSentence(\"$G\"));
BOOST_CHECK(!isSingleSentence(\"$GP\"));
BOOST_CHECK(!isSingleSentence(\"$GPG\"));
BOOST_CHECK(!isSingleSentence(\"$GPGL\"));
BOOST_CHECK(!isSingleSentence(\"$GPGLL\"));
BOOST_CHECK(!isSingleSentence(\"$GPGLL,\"));
BOOST_CHECK(!isSingleSentence(\"$GPGLL,*\"));
BOOST_CHECK(!isSingleSentence(\"$GPGLL,*1\"));
}
BOOST_AUTO_TEST_CASE(InvalidStartSymbol)
{
BOOST_CHECK(!isSingleSentence(\"SGPXXX,*01\"));
BOOST_CHECK(!isSingleSentence(\"GPXXX,*01\"));
}
BOOST_AUTO_TEST_CASE(InvalidLettersPrefix)
{
BOOST_CHECK(!isSingleSentence(\"$HPXXX,*01\"));
BOOST_CHECK(!isSingleSentence(\"$PXXX,*01\"));
BOOST_CHECK(!isSingleSentence(\"$GXXX,*01\"));
BOOST_CHECK(!isSingleSentence(\"$KLXXX,*01\"));
BOOST_CHECK(!isSingleSentence(\"$XXX,*01\"));
}
BOOST_AUTO_TEST_CASE(InvalidFormatCode)
{
BOOST_CHECK(!isSingleSentence(\"$GP,*01\"));
BOOST_CHECK(!isSingleSentence(\"$GPX,*01\"));
BOOST_CHECK(!isSingleSentence(\"$GPXX,*01\"));
BOOST_CHECK(!isSingleSentence(\"$GP1XX,*01\"));
BOOST_CHECK(!isSingleSentence(\"$GPX%X,*01\"));
BOOST_CHECK(!isSingleSentence(\"$GPXX ,*01\"));
BOOST_CHECK(!isSingleSentence(\"$GPabc,*01\"));
}
BOOST_AUTO_TEST_CASE(InvalidNoFields)
{
BOOST_CHECK(!isSingleSentence(\"$GPXXX*01\"));
}
BOOST_AUTO_TEST_CASE(InvalidReservedCharInField)
{
BOOST_CHECK(!isSingleSentence(\"$GPXXX,$77*01\"));
BOOST_CHECK(!isSingleSentence(\"$GPXXX,2*3,1*77\"));
}
BOOST_AUTO_TEST_CASE(InvalidChecksumPrefix)
{
BOOST_CHECK(!isSingleSentence(\"$GPXX,X77\"));
BOOST_CHECK(!isSingleSentence(\"$GPXX,X%77\"));
}
BOOST_AUTO_TEST_CASE(InvalidChecksumTooLong)
{
BOOST_CHECK(!isSingleSentence(\"$GPXXX,*012\"));
}
// There are some other ASCII symbols between the 0-9 characters and the A-Z range,
// and then some more between A-Z and the a-z range.
BOOST_AUTO_TEST_CASE(InvalidHexSymbolsFromMiddleOfASCIIRange)
{
BOOST_CHECK(!isSingleSentence(\"$GPXXX,*=3\"));
BOOST_CHECK(!isSingleSentence(\"$GPXXX,*4?\"));
BOOST_CHECK(!isSingleSentence(\"$GPXXX,*^5\"));
BOOST_CHECK(!isSingleSentence(\"$GPXXX,*8-\"));
}
// ASCII symbols taken from the edges just outside the ASCII ranges of valid hex characters.
BOOST_AUTO_TEST_CASE(InvalidHexSymbolsASCIIBoundaries)
{
BOOST_CHECK(!isSingleSentence(\"$GPXXX,*2:\"));
BOOST_CHECK(!isSingleSentence(\"$GPXXX,*@9\"));
BOOST_CHECK(!isSingleSentence(\"$GPXXX,*7G\"));
BOOST_CHECK(!isSingleSentence(\"$GPXXX,*`8\"));
BOOST_CHECK(!isSingleSentence(\"$GPXXX,*1/\"));
BOOST_CHECK(!isSingleSentence(\"$GPXXX,*g3\"));
}";
// result will be an iterator over tuples containing the start and end indices for each match in the string
let result = regex.captures_iter(string);
for mat in result {
println!("{:?}", mat);
}
}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Rust, please visit: https://docs.rs/regex/latest/regex/