Pattern matching » History » Version 8
digitalcircuit, 09/13/2018 04:36 AM
More formatting polish
| 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 | 6 | digitalcircuit | *This changed in Quassel @0.13@. "Follow the migration guide":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#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 | 5 | digitalcircuit | |_. @Regular expression@ |_. Item |_. Pattern matching type | |
| 20 | 5 | digitalcircuit | |/2. Unchecked | @Ignore Rule@ | "Wildcard":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Wildcard | |
| 21 | 5 | digitalcircuit | | @Scope@ | "Multiple wildcard":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Multiple-wildcard | |
| 22 | 5 | digitalcircuit | |/2. Checked | @Ignore Rule@ | "Regular expression":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Regular-expression | |
| 23 | 5 | 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 | 5 | digitalcircuit | |_. @RegEx@ |_. Item |_. Pattern matching type | |
| 30 | 5 | digitalcircuit | |/3. Unchecked | @Rule@ | "Phrase":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Phrase | |
| 31 | 5 | digitalcircuit | | @Sender@ | "Multiple wildcard":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Multiple-wildcard | |
| 32 | 5 | digitalcircuit | | @Channel@ | "Multiple wildcard":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Multiple-wildcard | |
| 33 | 5 | digitalcircuit | |/3. Checked | @Rule@ | "Regular expression":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Regular-expression | |
| 34 | 5 | digitalcircuit | | @Sender@ | "Regular expression":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Regular-expression | |
| 35 | 5 | 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 | 7 | digitalcircuit | If you're writing new rules, you can start at the "breakdown of usage":https://bugs.quassel-irc.org/projects/quassel-irc/wiki/Pattern_matching#Breakdown-of-usage. |
| 249 | 7 | digitalcircuit | |
| 250 | 1 | digitalcircuit | h3. Ignore Rules |
| 251 | 1 | digitalcircuit | |
| 252 | 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 @\!@. |
| 253 | 2 | digitalcircuit | |
| 254 | 4 | digitalcircuit | *Example of converting old wildcard rules to new format* |
| 255 | 5 | digitalcircuit | |_. Before |_. After |_. Remarks | |
| 256 | 4 | digitalcircuit | | @!literal-matching!@ | @\!literal-matching!@ | Only need to escape @!@ if it's at the start | |
| 257 | 5 | digitalcircuit | | @slashes \ within@ | @slashes \\ within@ | | |
| 258 | 5 | digitalcircuit | | @\! prefixed@ | @\\! prefixed@ | | |
| 259 | 4 | digitalcircuit | |
| 260 | 4 | digitalcircuit | The regular expression format now allows for escaping the first @!@ in case you want to literally match it, e.g. @\!regex.*@. |
| 261 | 4 | digitalcircuit | |
| 262 | 8 | digitalcircuit | *If your client and core version do not match, they will process some ignore rules differently.* |
| 263 | 4 | digitalcircuit | |
| 264 | 8 | digitalcircuit | If you've upgraded your Quassel client to @0.13@ and 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 keep pattern matching according to pre-@0.13@ behavior, which likely won't cause issues. If it does, you can temporarily change the affected ignore rules to @Dynamic@. |
| 265 | 4 | digitalcircuit | |
| 266 | 1 | digitalcircuit | h3. Highlight Rules |
| 267 | 4 | digitalcircuit | |
| 268 | 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. |
| 269 | 4 | digitalcircuit | |
| 270 | 8 | digitalcircuit | *Your existing highlight rules are automatically migrated to @RegEx@ if you've specified anything in the @Channel@ column.* Any affected rules will surround the phrase like so, <notextile>(^\|\W)original phrase(\W\|$)</notextile>. |
| 271 | 1 | digitalcircuit | |
| 272 | 8 | digitalcircuit | If you want to make use of the new multiple wildcard matching mode, uncheck @RegEx@ and set @Channel@ to a multiple wildcard pattern. |
| 273 | 4 | digitalcircuit | |
| 274 | 8 | digitalcircuit | _Example of undoing automatic @RegEx@ conversion to use new wildcard mode_ |
| 275 | 8 | digitalcircuit | |
| 276 | 5 | digitalcircuit | |_. @RegEx@ |_. Item |_. Pattern | |
| 277 | 5 | digitalcircuit | |/2. Checked | @Rule@ | <notextile>(^\|\W)highlight phrase(\W\|$)</notextile> | |
| 278 | 5 | digitalcircuit | | @Channel@ | <notextile>#quassel(|-*)</notextile> | |
| 279 | 5 | digitalcircuit | |/2. Unchecked | @Rule@ | highlight phrase | |
| 280 | 4 | digitalcircuit | | @Channel@ | #quassel; #quassel-* | |
| 281 | 1 | digitalcircuit | |
| 282 | 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. |
| 283 | 1 | digitalcircuit | |
| 284 | 1 | digitalcircuit | h2. Technical details |
| 285 | 1 | digitalcircuit | |
| 286 | 8 | 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 it's only used inside Quassel for nickname matching. |