$re = '/"\$(G[ABILNPQ][A-Z]{3}(?:,(?:\d+(?:\.\d+)?|[a-zA-Z]+|))*,\w*\*[\dA-Fa-f]{2})"/m';
$str = '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"));
}';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
// Print the entire match result
var_dump($matches);
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 PHP, please visit: http://php.net/manual/en/ref.pcre.php