QregExp for IPv4 address (xxx.xxx.xxx.xxx)
- 
In my Application, I have log window (subclassed QPlainTextEdit with syntax highlighting, based on Sytnax Highlighter Example. I've implemented three types of log info entry: - 
[INFO] - Info type log entry begins with QString containing "[INFO]" 
- 
[WARNING] - Info type log entry begins with QString containing "[WARNING]" 
- 
[ERROR] - Info type log entry begins with QString containing "[ERROR]" 
 Based on log info type, the color of entry is applied - blue (INFO), yellow (WARNING) and red (ERROR). This all works perfectly. Now, the log entry contents continues with time stamp, as you can see from following class static method: const QString UeLogWindow::ueCreateLogEntry(const quint8& logEntryType, const QString& logText) { // TODO improve logEntryType - work with enum // TODO remove appended ip address QString result=QString(); QString timeStamp=QDateTime::currentDateTime().toString("dd.MM.yyyy hh:mm:ss:zzz"); switch(logEntryType) { case 0: { result=tr("[INFO]"); break; } // case case 1: { result=tr("[WARNING]"); break; } // case case 2: { result=tr("[ERROR]"); break; } // case default: { break; } // default } // switch result.append(" ") .append(timeStamp) .append(" ") .append(logText) .append(" ") .append("192.168.100.1"); // only for test purposes to see if highlighting is working return result; } // ueCreateLogEntryNow, here are my sytnax highlighting rules: UeLogWindowTextHighlighter::UeLogWindowTextHighlighter(QTextDocument* const parent) : QSyntaxHighlighter (parent) { UeHighlightRule ruleInfo; UeHighlightRule ruleWarning; UeHighlightRule ruleError; UeHighlightRule ruleIPv4Address; QTextCharFormat ruleInfoFormat; QTextCharFormat ruleWarningFormat; QTextCharFormat ruleErrorFormat; QTextCharFormat ruleIPv4AddressFormat; ruleInfoFormat.setForeground(Qt::darkBlue); ruleInfoFormat.setFontWeight(QFont::ExtraLight); ruleInfo.pattern=QRegExp("^\\[INFO\\].*"); ruleInfo.format=ruleInfoFormat; ruleWarningFormat.setForeground(Qt::darkYellow); ruleWarningFormat.setFontWeight(QFont::Normal); ruleWarning.pattern=QRegExp("^\\[WARNING\\].*"); ruleWarning.format=ruleWarningFormat; ruleErrorFormat.setForeground(Qt::darkRed); ruleErrorFormat.setFontWeight(QFont::ExtraBold); ruleError.pattern=QRegExp("^\\[ERROR\\].*"); ruleError.format=ruleErrorFormat; ruleIPv4AddressFormat.setFontWeight(QFont::ExtraBold); ruleIPv4Address.pattern=QRegExp("(\\d{1,3}.\\d{1,3}.\\d{1,3}.\\d{1,3})"); ruleIPv4Address.format=ruleIPv4AddressFormat; m_ueHighlightRules.append(ruleInfo); m_ueHighlightRules.append(ruleWarning); m_ueHighlightRules.append(ruleError); m_ueHighlightRules.append(ruleIPv4Address); } // constructorNow, ruleIPv4Address also affects my timestamp beside ip address itself in log entry: 
  
 How do I change regular expression to avoid affecting my timestamp?
- 
- 
. should be escaped 
 "(\\d{1,3}.\\d{1,3}.\\d{1,3}.\\d{1,3})"should become"(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})"On a separate note, if you are using Qt5, you should use QregularExpression instead of QRegExp Edit: 
 @micland was faster on the drawEdit2: 
 I think your internationalisation will break the syntax highlight (e.g. if WARNING becomes ATTENTION in French the regular expression will not match anymore)Edit3: 
 Your regexp will match invalid IP addresses (500.1.1.0 should not match) see here: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html for the correct pattern
- 
. should be escaped 
 "(\\d{1,3}.\\d{1,3}.\\d{1,3}.\\d{1,3})"should become"(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})"On a separate note, if you are using Qt5, you should use QregularExpression instead of QRegExp Edit: 
 @micland was faster on the drawEdit2: 
 I think your internationalisation will break the syntax highlight (e.g. if WARNING becomes ATTENTION in French the regular expression will not match anymore)Edit3: 
 Your regexp will match invalid IP addresses (500.1.1.0 should not match) see here: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html for the correct pattern@VRonin said: . should be escaped 
 "(\\d{1,3}.\\d{1,3}.\\d{1,3}.\\d{1,3})"should become"(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})"On a separate note, if you are using Qt5, you should use QregularExpression instead of QRegExp Edit: 
 @micland was faster on the drawEdit2: 
 I think your internationalisation will break the syntax highlight (e.g. if WARNING becomes ATTENTION in French the regular expression will not match anymore)Edit3: 
 Your regexp will match invalid IP addresses (500.1.1.0 should not match) see here: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html for the correct patternYou have strong good point by commenting break of syntax highlight because of internationalisation, are there any solutions for current code? 
- 
@VRonin said: . should be escaped 
 "(\\d{1,3}.\\d{1,3}.\\d{1,3}.\\d{1,3})"should become"(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})"On a separate note, if you are using Qt5, you should use QregularExpression instead of QRegExp Edit: 
 @micland was faster on the drawEdit2: 
 I think your internationalisation will break the syntax highlight (e.g. if WARNING becomes ATTENTION in French the regular expression will not match anymore)Edit3: 
 Your regexp will match invalid IP addresses (500.1.1.0 should not match) see here: https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html for the correct patternYou have strong good point by commenting break of syntax highlight because of internationalisation, are there any solutions for current code? @MarkoSan said: are there any solutions for current code? either you enclose the RegExp pattern in tr()and trust the translator to do the right thing or you declareprivate: const QString logTags[3];then in the constructor add the initialisation UeLogWindow::UeLogWindow(QWidget parent) : \\ ... other inits , logTags{tr("[INFO]"),tr("[WARNING]"),tr("[ERROR]")}(if you don't have access to C++11 functionality you should not declare const and initialise the members with the usual [] operator) this also simplifies a lot the switch(logEntryType)partto use them in the regular expression you then just have to call QRegularExpression::escape(). for example, ruleError.pattern=QRegExp("^\\[ERROR\\].*");would becomeruleError.pattern=QRegExp("^"+QRegExp::escape(logEntryType[2])+".*");Again, here I used QRegExp but you should REALLY use QRegularExpression especially if you expect a big number of matches 
