QTextDocument-Line-ending-and-Advanced-regular-expression-support: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
(Convert ExpressionEngine section headers)
(Moved to QTextDocument Block Boundary QRegExp and reformatted)
 
(3 intermediate revisions by one other user not shown)
Line 1: Line 1:
{{Cleanup | reason=Auto-imported from ExpressionEngine.}}
#REDIRECT [[QTextDocument Block Boundary QRegExp]]
 
= QTextDocument Line Endings and Advanced RegExp =
== Warning: Experimental Info ==
 
I've picked from QtForum itself. It's progressive article. I will update more when I will achieve something.
 
The find(regex) method of QTextDocument will not attempt to match across a “block” boundary (see answers in this post [developer.qt.nokia.com]). As a result, although the QRegExp doc says that is matched by .* and by , one can never get a match to in a QPlainTextEdit document. The is end of block and the search never spans a block. Thus it seems impossible for a pattern like
 
<code><b>.*</b><code>
 
to find a match when the markup begins on one line and ends on another.
 
There is a way around this. The restriction is in QTextDocument; QRegExp does perform as documented when it is applied to a QString. So the following code can apply a general regex to a document. This is using PyQt4; the translation to C++ should be clear. Given is a QPlainTextEdit qpte whose cursor is the starting point for the search. Also given is a QRegExp qrxp that has been prepared with a search pattern such as “<b>.*</b>” and its minimal and case switches set.
 
</code>
start_tc = qpte.textCursor() # cursor with starting position
range_tc = QTextCursor(start_tc) # make a copy linked to same doc
range_tc.movePosition(QTextCursor.End) # point to end of doc
# set cursor to select all text from starting point to end
range_tc.setPosition(start_tc.selectionStart(),QTextCursor.KeepAnchor)
# apply regexp to (part of) the document as a QString
hit_pos = qrxp.indexIn(range_tc.selectedText())
if hit_pos > –1 : # first occurrence at hit_pos offset
find_tc = QTextCursor(start_tc) # another cursor
find_tc.setPosition(start_tc.selectionStart()+hit_pos) # point to hit
find_tc.movePosition(QTextCursor.Right,
QTextCursor.KeepAnchor,
qrxp.matchedLength()) # select matched text
qpte.setTextCursor(find_tc) # match visible to user<code>

Latest revision as of 06:05, 13 July 2015