Project

General

Profile

Pattern matching » History » Version 4

digitalcircuit, 09/13/2018 04:25 AM
Fill in migration notes, prettify tables

1 1 digitalcircuit
h1. Pattern matching
2 1 digitalcircuit
3 1 digitalcircuit
*WORK IN PROGRESS*
4 1 digitalcircuit
5 1 digitalcircuit
{{toc}}
6 1 digitalcircuit
7 1 digitalcircuit
h2. Upgrade notice
8 1 digitalcircuit
9 4 digitalcircuit
*This changed in Quassel @0.13@.  "Follow the migration guide":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching/edit#Migrating-to-Quassel-013 if you're upgrading from an earlier version.*
10 1 digitalcircuit
11 1 digitalcircuit
When using the client and core with different versions, some ignore rules will be processed differently.
12 1 digitalcircuit
13 1 digitalcircuit
h2. Breakdown of usage
14 1 digitalcircuit
15 1 digitalcircuit
Quassel supports several types of pattern matching for ignore and highlight rules.
16 1 digitalcircuit
17 1 digitalcircuit
h3. Ignore Rules
18 1 digitalcircuit
19 1 digitalcircuit
|_. @Regular expression@ |_. Item |_. Pattern matching type |
20 4 digitalcircuit
|/2. Unchecked | @Ignore Rule@ | "Wildcard":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Wildcard |
21 4 digitalcircuit
| @Scope@ | "Multiple wildcard":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Multiple-wildcard |
22 4 digitalcircuit
|/2. Checked | @Ignore Rule@ | "Regular expression":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Regular-expression |
23 4 digitalcircuit
| @Scope@ | "Multiple wildcard":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Multiple-wildcard |
24 1 digitalcircuit
25 1 digitalcircuit
_For backwards compatibility, the @Regular expression@ checkbox only affects @Ignore Rule@ and not @Scope@._
26 1 digitalcircuit
27 1 digitalcircuit
h3. Highlight Rules
28 1 digitalcircuit
29 1 digitalcircuit
|_. @RegEx@ |_. Item |_. Pattern matching type |
30 4 digitalcircuit
|/3. Unchecked | @Rule@ | "Phrase":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Phrase |
31 4 digitalcircuit
| @Sender@ | "Multiple wildcard":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Multiple-wildcard |
32 4 digitalcircuit
| @Channel@ | "Multiple wildcard":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Multiple-wildcard |
33 4 digitalcircuit
|/3. Checked | @Rule@ | "Regular expression":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Regular-expression |
34 4 digitalcircuit
| @Sender@ | "Regular expression":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Regular-expression |
35 4 digitalcircuit
| @Channel@ | "Regular expression":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Regular-expression |
36 1 digitalcircuit
37 1 digitalcircuit
_This applies to both @Local Highlights@ and @Remote Highlights@ (or if using Monolithic, @Legacy Highlights@ and @Highlights@)._
38 1 digitalcircuit
39 1 digitalcircuit
h2. Types
40 1 digitalcircuit
41 1 digitalcircuit
h3. Phrase
42 1 digitalcircuit
43 1 digitalcircuit
This matches exactly what you type.
44 1 digitalcircuit
45 1 digitalcircuit
<pre>
46 1 digitalcircuit
word
47 1 digitalcircuit
</pre>
48 1 digitalcircuit
49 1 digitalcircuit
* Matches
50 1 digitalcircuit
** @word@
51 1 digitalcircuit
** @A word.@
52 1 digitalcircuit
** @has a word in it@ 
53 1 digitalcircuit
* Does not match
54 1 digitalcircuit
** @wording@
55 1 digitalcircuit
56 1 digitalcircuit
_Changed in Quassel @0.13@:_
57 1 digitalcircuit
58 1 digitalcircuit
Spaces are matched, too, allowing you to be more specific.
59 1 digitalcircuit
60 1 digitalcircuit
<pre>
61 1 digitalcircuit
 spaced
62 1 digitalcircuit
</pre>
63 1 digitalcircuit
64 1 digitalcircuit
_There's a leading space in the example above._
65 1 digitalcircuit
66 1 digitalcircuit
* Matches
67 1 digitalcircuit
** @, spaced@
68 1 digitalcircuit
** @is spaced out@
69 1 digitalcircuit
* Does not match
70 1 digitalcircuit
** @;spaced@
71 1 digitalcircuit
72 3 digitalcircuit
"Return to breakdown of usage":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Breakdown-of-usage
73 2 digitalcircuit
74 1 digitalcircuit
h3. Wildcard
75 1 digitalcircuit
76 1 digitalcircuit
_Changed in Quassel @0.13@:_
77 1 digitalcircuit
78 2 digitalcircuit
This uses simple wildcard substitution with @*@ and @?@ to match any characters or a single character, respectively.  The backslash character @\@ allows matching a literal @*@, @?@, or @\@.
79 1 digitalcircuit
80 1 digitalcircuit
<pre>
81 1 digitalcircuit
*Asking questions\?  Nope?
82 1 digitalcircuit
</pre>
83 1 digitalcircuit
84 1 digitalcircuit
* Matches
85 1 digitalcircuit
** @Asking questions? Nopea@
86 1 digitalcircuit
** @Basking questions? Nope.@
87 1 digitalcircuit
* Does not match
88 1 digitalcircuit
** @Asking questions. Nope.@
89 1 digitalcircuit
** @Asking questions? Nopes.@
90 1 digitalcircuit
91 1 digitalcircuit
Implicit wildcard is supported, too, allowing you to match everything *except* for what you specify.
92 1 digitalcircuit
93 1 digitalcircuit
<pre>
94 1 digitalcircuit
!*filter*
95 1 digitalcircuit
</pre>
96 1 digitalcircuit
97 1 digitalcircuit
* Matches
98 1 digitalcircuit
** _Everything, unless it contains something from the below list_
99 1 digitalcircuit
* Does not match
100 1 digitalcircuit
** @filter@
101 1 digitalcircuit
** @filtering@
102 1 digitalcircuit
** @#nofilter yo@
103 1 digitalcircuit
104 1 digitalcircuit
Exclamation points can be escaped at the beginning to match something that starts with @!@ (_this is not required elsewhere_).
105 1 digitalcircuit
106 1 digitalcircuit
<pre>
107 1 digitalcircuit
\!*filter*
108 1 digitalcircuit
</pre>
109 1 digitalcircuit
110 1 digitalcircuit
* Matches
111 1 digitalcircuit
** @!filter@
112 1 digitalcircuit
** @!yes filtering@
113 1 digitalcircuit
* Does not match
114 1 digitalcircuit
** @filter@
115 1 digitalcircuit
116 1 digitalcircuit
The @\@ character can be escaped, too, in case you're matching something that starts with @\!@.
117 1 digitalcircuit
118 1 digitalcircuit
<pre>
119 1 digitalcircuit
\\!*filter*
120 1 digitalcircuit
</pre>
121 1 digitalcircuit
122 1 digitalcircuit
* Matches
123 1 digitalcircuit
** @\!filter@
124 1 digitalcircuit
** @\!yes filtering@
125 1 digitalcircuit
* Does not match
126 1 digitalcircuit
** @filter@
127 1 digitalcircuit
** @!filter@
128 1 digitalcircuit
129 3 digitalcircuit
"Return to breakdown of usage":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Breakdown-of-usage
130 2 digitalcircuit
131 1 digitalcircuit
h3. Multiple wildcard
132 1 digitalcircuit
133 3 digitalcircuit
This allows matching multiple "wildcard patterns":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Wildcard all in one rule by separating each wildcard with semicolons @;@.
134 2 digitalcircuit
135 2 digitalcircuit
<pre>
136 2 digitalcircuit
alpha; beta*
137 2 digitalcircuit
</pre>
138 2 digitalcircuit
139 2 digitalcircuit
* Matches
140 2 digitalcircuit
** @alpha@
141 2 digitalcircuit
** @betas@
142 2 digitalcircuit
** @beta!@
143 2 digitalcircuit
* Does not match
144 2 digitalcircuit
** @alphamore@
145 2 digitalcircuit
** @nonbeta@
146 2 digitalcircuit
147 2 digitalcircuit
_Changed in Quassel @0.13@:_
148 2 digitalcircuit
149 2 digitalcircuit
More complex wildcard patterns are possible.  Use @\@ to escape special characters.
150 2 digitalcircuit
151 2 digitalcircuit
<pre>
152 2 digitalcircuit
Alice!*; Bob!*@example.com; Carol*!*; !Caroline!*
153 2 digitalcircuit
Dan!*; escaped \; separator; \!not-inverted; \\!slash-prefixed
154 2 digitalcircuit
</pre>
155 2 digitalcircuit
156 2 digitalcircuit
_For ignore rule @Scope@, you can use @;@ and line breaks interchangeably._
157 2 digitalcircuit
158 2 digitalcircuit
* Matches
159 2 digitalcircuit
** @Alice![...]@
160 2 digitalcircuit
** @Bob![...]@example.com@
161 2 digitalcircuit
** @Carol[...]![...]@ except as noted below
162 2 digitalcircuit
** @Dan![...]@
163 2 digitalcircuit
** @escaped ; separator@
164 2 digitalcircuit
** @!not-inverted@
165 2 digitalcircuit
** @\!slash-prefixed@
166 2 digitalcircuit
* Does not match
167 2 digitalcircuit
** @Caroline![...]@
168 2 digitalcircuit
** @Malice![...]
169 2 digitalcircuit
** @John!@
170 2 digitalcircuit
171 2 digitalcircuit
Implicit wildcard is supported, too, allowing you to match everything *except* for what you specify.
172 2 digitalcircuit
173 2 digitalcircuit
<pre>
174 2 digitalcircuit
!Announce*!*; !Wheatley!aperture@*
175 2 digitalcircuit
</pre>
176 2 digitalcircuit
177 2 digitalcircuit
* Matches
178 2 digitalcircuit
** _Everything, unless it contains something from the below list_
179 2 digitalcircuit
* Does not match
180 2 digitalcircuit
** @Announce[...]![...]@
181 2 digitalcircuit
** @Wheatley!aperture@[...]@
182 2 digitalcircuit
183 3 digitalcircuit
"Return to breakdown of usage":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Breakdown-of-usage
184 2 digitalcircuit
185 1 digitalcircuit
h3. Regular expression
186 1 digitalcircuit
187 2 digitalcircuit
This matches using the full regular expression language, best for complex rules and those already familiar with how regular expressions work.  Quassel offers a non-standard @!@ prefix to invert the rule; if not desired, escape as @\!@.
188 2 digitalcircuit
189 2 digitalcircuit
The web provides many resources for testing and verifying regular expressions, including https://regex101.com/ .
190 2 digitalcircuit
191 2 digitalcircuit
Some differences exist from Perl due to design choices and limitations of the Qt framework.  These are documented on the Qt documentation site for "QRegularExpression":https://doc.qt.io/qt-5/qregularexpression.html#unsupported-perl-compatible-regular-expressions-features with Qt 5, and "QRegExp":https://doc.qt.io/qt-5/qregexp.html#notes-for-perl-users for Qt 4.  If you're not sure, you're likely using a Qt 5 build.
192 2 digitalcircuit
193 2 digitalcircuit
<pre>
194 2 digitalcircuit
simple.\*escape-match.*
195 2 digitalcircuit
</pre>
196 2 digitalcircuit
197 2 digitalcircuit
* Matches
198 2 digitalcircuit
** @simpleA*escape-match@
199 2 digitalcircuit
** @simpleA*escape-matchBBBB@
200 2 digitalcircuit
* Does not match
201 2 digitalcircuit
** @not above@
202 2 digitalcircuit
** @simpleA*escape-mat@
203 2 digitalcircuit
** @simple*escape-match@
204 2 digitalcircuit
** @simpleABBBBescape-matchBBBB@
205 2 digitalcircuit
206 2 digitalcircuit
Inverted rules are supported, allowing you to match everything *except* for what you specify.
207 2 digitalcircuit
208 2 digitalcircuit
<pre>
209 2 digitalcircuit
!invert.\*escape-match.*
210 2 digitalcircuit
</pre>
211 2 digitalcircuit
212 2 digitalcircuit
* Matches
213 2 digitalcircuit
** _Everything, unless it contains something from the below list_
214 2 digitalcircuit
* Does not match
215 2 digitalcircuit
** @invertA*escape-match@
216 2 digitalcircuit
** @invertA*escape-matchBBBB@
217 2 digitalcircuit
218 2 digitalcircuit
_Changed in Quassel @0.13@:_
219 2 digitalcircuit
220 2 digitalcircuit
Exclamation points can be escaped at the beginning to match something that starts with @!@ (_this is not required elsewhere_).
221 2 digitalcircuit
222 2 digitalcircuit
<pre>
223 2 digitalcircuit
\!simple.\*escape-match.*
224 2 digitalcircuit
</pre>
225 2 digitalcircuit
226 2 digitalcircuit
* Matches
227 2 digitalcircuit
** @!simpleA*escape-matchBBBB@
228 2 digitalcircuit
* Does not match
229 2 digitalcircuit
** @simpleA*escape-matchBBBB@
230 2 digitalcircuit
231 2 digitalcircuit
The @\@ character can be escaped, too, in case you're matching something that starts with @\!@.
232 2 digitalcircuit
233 2 digitalcircuit
<pre>
234 2 digitalcircuit
\\!simple.\*escape-match.*
235 2 digitalcircuit
</pre>
236 2 digitalcircuit
237 1 digitalcircuit
* Matches
238 2 digitalcircuit
** @\!simpleA*escape-matchBBBB@
239 1 digitalcircuit
* Does not match
240 1 digitalcircuit
** @!simpleA*escape-matchBBBB@
241 1 digitalcircuit
242 1 digitalcircuit
"Return to breakdown of usage":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Breakdown-of-usage
243 1 digitalcircuit
244 4 digitalcircuit
h2. Migrating to Quassel @0.13@
245 1 digitalcircuit
246 4 digitalcircuit
Quassel @0.13@ introduced new behavior for pattern matching to provide more flexibility and to improve performance.  Unfortunately, due to the complexity of automatically migrating (_patches welcome!_), you might have to manually migrate some ignore and highlight rules.
247 1 digitalcircuit
248 1 digitalcircuit
h3. Ignore Rules
249 1 digitalcircuit
250 4 digitalcircuit
The wildcard matching mode now allows inverting the match with @!@, and escaping @*@ and @?@ with @\@, so you can match a phrase containing question marks or asterisks.  However, this means @\@ must now be escaped as @\\@, and @!@ at the start must be escaped as @\!@.
251 2 digitalcircuit
252 4 digitalcircuit
*Example of converting old wildcard rules to new format*
253 4 digitalcircuit
|_. Before |_. After |_. Remarks |
254 4 digitalcircuit
| @!literal-matching!@ | @\!literal-matching!@ | Only need to escape @!@ if it's at the start |
255 4 digitalcircuit
| @slashes \ within@ | @slashes \\ within@ | |
256 4 digitalcircuit
| @\! prefixed@ | @\\! prefixed@ | |
257 4 digitalcircuit
258 4 digitalcircuit
The regular expression format now allows for escaping the first @!@ in case you want to literally match it, e.g. @\!regex.*@.
259 4 digitalcircuit
260 4 digitalcircuit
*If your client and core version do not match, they will process ignore rules differently.*
261 4 digitalcircuit
262 4 digitalcircuit
If upgrading the Quassel core to @0.13@ is not yet feasible, you can workaround this for ignore rules that start with @!@ or contain @\@ by migrating them as above.  For @Permanent@ ignore rules, the core will continue to pattern match according to pre-@0.13@ rules, which isn't likely to cause issues.  If it does, you can temporarily change the affected ignore rules to @Dynamic@.
263 4 digitalcircuit
264 1 digitalcircuit
h3. Highlight Rules
265 4 digitalcircuit
266 4 digitalcircuit
The @RegEx@ checkbox now affects the @Channel@ column, too, switching between multiple wildcard and regular expressions "as described above":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching/edit#Highlight-Rules.
267 4 digitalcircuit
268 4 digitalcircuit
*Your existing highlight rules are automatically migrated to @RegEx@ if you've specified anything in the @Channel@ column.*  If you want to make use of the new multiple wildcard matching mode, uncheck @RegEx@ and set @Channel@ to a multiple wildcard pattern.
269 4 digitalcircuit
270 4 digitalcircuit
_Example of undoing automatic @RegEx@ conversion_
271 4 digitalcircuit
272 4 digitalcircuit
|_. @RegEx@ |_. Item |_. Pattern |
273 4 digitalcircuit
|/2. Checked | @Rule@ | <notextile>(^\|\W)highlight phrase(\W\|$)</notextile> |
274 4 digitalcircuit
| @Channel@ | <notextile>#quassel(|-*)</notextile> |
275 4 digitalcircuit
|/2. Unchecked | @Rule@ | highlight phrase |
276 4 digitalcircuit
| @Channel@ | #quassel; #quassel-* |
277 4 digitalcircuit
278 4 digitalcircuit
With the @Remote Highlights@ feature in Quassel @0.13@, the @Sender@ column behaves the same way as the @Channel@ column, switching modes according to the @RegEx@ checkbox.
279 1 digitalcircuit
280 1 digitalcircuit
h2. Technical details
281 1 digitalcircuit
282 1 digitalcircuit
For all the technical details and source code changes, take a look at "Quassel pull request #415":https://github.com/quassel/quassel/pull/415 .  @MultiPhrase@ is not covered here as Quassel only uses it internally for nickname matching.