掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: zhu1234

[工具] PowerGrep 学ing 汇总贴

[复制链接]

该用户从未签到

 楼主| 发表于 2017-12-7 10:26:52 | 显示全部楼层
Using Backreferences To Match The Same Text Again 使用引用再次匹配同一文本
8 j0 z6 {% {+ I( Z; C: F
; J3 ?1 M/ ~* T3 T3 ^5 \Backreferences match 引用匹配与先前由捕获组匹配的文本。假设您要匹配一对打开和关闭的 HTML 标记, 以及两者之间的文本。通过将开始标记放入引用, 我们可以重用结束标记的标签名称。这里是如何: <([A-Z][A-Z0-9]*)\b[^>]*>.*?</\1>。此 regex 只包含一对圆括号, 它捕获由 [A-Z][A-Z0-9]* 匹配的字符串。这是打开的 HTML 标记。(由于 HTML 标记不区分大小写, 因此此 regex 需要不区分大小写的匹配。引用 \1 (反斜线1) 引用第一个捕获组。\1 匹配第一个捕获组所匹配的完全相同的文本。/在它是字面字符之前。它只是我们试图匹配的结束 HTML 标记中的正斜线。  E5 Q7 I3 ~# @6 G9 D& U, e
6 P4 [; s  n- E# c( |
若要计算特定引用的数目, 请从左向右扫描正则表达式。计算所有已编号的捕获组的左括号。第一个括号开始引用数字 1, 第二个数字, 等等。跳过作为其他语法 (如捕获组) 的一部分的括号。这意味着捕获括号有另一个好处: 您可以将它们插入到正则表达式中, 而不必更改分配给引用的数字。在修改复杂的正则表达式时, 这可能非常有用。
. W3 S7 r" f9 @0 \& a您可以多次重复使用相同的引用。([a-c])x\1x\1匹配  axaxa, bxbxb 和 cxcxc.' y+ T- P- e; \  u3 \; b# `
大多数 regex 的风格支持多达99捕获组和两位数的引用。因此, 如果 regex 有99捕获组, 则 \99 是有效的引用。
5 T5 L6 }2 n, a( K) Y! p" ?8 N
, D, T! r/ b; E2 N9 pLooking Inside The Regex Engine 查看 Regex 引擎的内部- u; |5 D. C* ~* D

8 e1 q8 k4 n2 y" @) `2 K: X让我们看看 regex 引擎如何应用 regex <([A-Z][A-Z0-9]*)\b[^>]*>.*?</\1>,到字符串测试 Testing <B><I>bold italic</I></B> text.。regex 中的第一个标记是文本 <。regex 引擎遍历字符串, 直到它在字符串的第一个 < 中匹配。下一个标记是 [A-Z]。regex 引擎还注意到它现在在第一对捕获括号内。[A-Z] 匹配 B。引擎前进到 [A-Z0-9] 和 >。此匹配失败。然而, 因为明星, 这是完全的罚款。字符串中的位置保持为 >。单词边界 \b 与 > 匹配, 因为它前面有 B。单词边界不会使引擎通过字符串前进。regex 中的位置高级为  [^>]。- C' l: I! {. f& ^/ D
此步骤跨越第一对捕获括号的右括号。这将提示 regex 引擎将它们内部匹配的内容存储到第一个引用中。在这种情况下, B 是存储的。
/ G0 Y/ |. V, _! ]& a在存储引用后, 引擎将进行匹配尝试。[^>] 不匹配 >。再次, 因为另一个明星, 这不是一个问题。字符串中的位置保留在 > 中, 在 regex 中的位置将进行到 >。这些明显吻合下一个标记是一个点, 由一个懒星重复。由于懒惰, 正则表达式引擎最初跳过这个令牌, 注意它应该回溯, 以防 regex 的其余部分失败。
. `' U+ m* m: O  G( x5 j
5 C' F& I) G9 U) w  n% D引擎现在已到达 regex 中的第二个 <, 第二个 < 在字符串中。这场匹配下一个标记是/。这不符合我, 和引擎被迫回溯到点。该点与字符串中的第二个 < 匹配。星仍然是懒惰的, 因此引擎再注意可利用的回溯位置和前进到 < 和 I。这些不匹配, 所以引擎再回溯。
+ B4 Z7 A6 D% t$ Q5 ?5 ?2 U! m& i
" W5 a4 X) V5 T% X8 d回溯继续, 直到点已占用 <I>bold italic。此时, < 与字符串中的第三个 < 匹配, 下一个标记是/匹配/。下一个标记是 \1。请注意, 该标记是引用, 而不是 B。引擎不替换正则表达式中的引用。每次引擎到达引用时, 它都会读取存储的值。这意味着, 如果引擎已经回溯到第一对捕获括号之前, 在第二次到达 \1, 将使用第一个引用中存储的新值。但这不是发生在这里, 所以 B 是。这无法匹配I, 所以引擎再次回溯, 和点占用第三 < 在字符串。/ Z! F9 O) X" h3 ^: `
$ y; D+ B, E' ?% w9 Z% U
回溯继续, 直到点已占用 <I>bold italic</I>。在这一点上, < 匹配 < 和/匹配/。引擎再到达在 \1。引用仍然持有 B. \1 匹配 B。regex 中的最后一个标记, > 匹配 >。已找到完整的匹配项: <B><I>bold italic</I></B>。
' c& n0 k# w) ~8 T3 R
& Y2 ^& M. u5 zBacktracking Into Capturing Groups 回溯到捕获组
4 S) N1 Y3 w  @2 a" U" q( T4 r8 @' A/ u
您可能想知道 \b 在上述的 <([A-Z][A-Z0-9]*)\b[^>]*>.*?</\1> 中。这是为了确保 regex 不会匹配错误配对的标签, 如 <boo>bold</b>。您可能认为这是不可能发生的, 因为捕获组与 boo 匹配, 导致 \1 尝试匹配相同的, 并且失败。这确实是发生了什么。
! F! h5 ?& ]$ c) U6 g3 s2 n0 N8 i0 a: W' }% ?' P
让我们取正则表达式  <([A-Z][A-Z0-9]*)[^>]*>.*?</\1> 个没有单词边界的 >, 在第一次出现 \1 故障的位置查,看 regex 引擎的内部。首先。继续扩展, 直到它到达字符串的末尾, </\1> 每次都无法匹配.*?匹配一个字符。
% _& x& U* k' W/ l' K
' D7 c7 ~* T3 b( V6 U7 _然后, regex 引擎回溯到捕获组中。[A-Z0-9]*  有匹配的 oo, 但只是高兴地匹配 o 或没有。回溯时, [A-Z0-9]* 被强制放弃一个字符。regex 引擎将继续, 第二次退出捕获组。由于 [A-Z][A-Z0-9]* 现在已匹配 bo, 这就是存储在捕获组中的内容, 覆盖以前存储的 boo。[^>]* 与开始标记中的第二个 o 匹配。>.*?</ 匹配 >bold<。\1 再次失败。2 t( `8 H- M4 f/ b
正则表达式引擎再次进行所有相同的回溯, 直到 [A-Z0-9]* 被迫放弃另一个字符, 导致它不匹配, 这是星号允许的。捕获组现在只存储 b. [^>]* 现在与 oo 匹配。>.*?</ 再次匹配 >bold<。 \1 现在成功了, > 和一个整体匹配被发现。但不是我们想要的那个。& S2 S! q7 N( }/ L/ r, \
有几种解决方案。一个是使用单词边界。当 [A-Z0-9]*回溯第一次将捕获组减少为 bo 时, \b 无法匹配 o 和 o。这迫使 [A-Z0-9]* 立即再次回溯。捕获组被还原为 b, 并且单词边界在 b  和 o 之间失败。没有进一步的回溯位置, 因此整个匹配尝试失败。- y* w# u) Z3 ]$ O1 Q, ?6 s* Q2 V4 O
我们需要单词边界的原因是我们使用 [^>]* 来跳过标签中的任何属性。如果配对的标签没有任何属性, 您可以将其保留, 并使用  <([A-Z][A-Z0-9]*)>.*?</\1>. 。每次 [A-Z0-9]* 回溯, 随后的 > 都无法匹配, 很快结束了匹配尝试。
( x# A& [. |' g" a2 {如果不希望 regex 引擎回溯到捕获组中, 则可以使用原子组。关于atomic grouping原子分组的教程部分有所有的细节。, H6 i4 S/ Z( W6 ?( B; e
Repetition and Backreferences 重复和引用) |4 d3 c* j( U) t5 ^

+ v. v  S( q2 M; p/ [3 y3 Q! J正如我在上面提到的, 在正则表达式中, regex 引擎不会永久替换引用。它将使用在每次需要使用时保存到引用中的最后一个匹配项。如果通过捕获括号找到新匹配项, 则会覆盖以前保存的匹配项。([abc]+) 和 ([abc])+ 之间有明显的区别。虽然两者都成功匹配了 cab, 但第一个 regex 将把 cab 放入第一个引用, 而第二个 regex 只存储 b。这是因为在第二个 regex 中, 加号导致了一对括号重复三次。第一次存储 c。第二次 a, 第三次 b。每次, 以前的值都被覆盖, 所以 b 保持不变。
9 v5 T- P- s" |  ^% V) \
2 W! U# P; O- b- ~2 D2 n5 L5 t这也意味着 ([abc]+)=\1 将匹配 cab=cab, 而该 ([abc])+=\1 将不匹配。原因是当引擎到达 \1, 它持有 b, 它无法匹配 c. 显而易见。使用引用时, 请始终仔细检查您是否真的捕获了所需的内容。
& n1 m% Q+ s4 y
; V% O5 K/ u4 N3 n
+ i, D9 O1 a. ~# N9 t- _1 }5 YUseful Example: Checking for Doubled Words 有用的例子: 检查重复的词- J4 L! G: G+ u- f

9 E4 g1 m( G4 @. v" ~" y+ S当编辑文字时, 重复词如 "the the" 容易发生。在文本编辑器中使用正则表达式 \b(\w+)\s+\1\b, 您可以很容易地找到它们。要删除第二个单词, 只需键入 \1 作为替换文本, 然后单击 "替换" 按钮。
: n- r$ [; h% n; e% F2 U
( z1 X4 ?1 W+ Q& S0 xParentheses and Backreferences Cannot Be Used Inside Character Classes 不能在字符类内使用括号和引用( |& N& o5 w* d% w
4 h" ?' H$ M6 k* b9 x( ]- W2 H
不能在字符类内使用圆括号, 至少不能将其用作元字符。将括号放在字符类中时, 它被视为文本字符。因此, regex [(a)b] 匹配 a, b, ( 和 )。5 u: P5 r+ @* v' Z6 y( j1 H
引用也不能在字符类中使用。在 regex 中, 如 (a)[\1b]中的 \1 是不必要的转义文字1。

该用户从未签到

 楼主| 发表于 2017-12-7 10:49:03 | 显示全部楼层
Backreferences to Failed Groups 引用到失败的组
3 |- O( D. ?& X5 l& {( n3 y# d$ M6 c8 G
上一主题引用适用于所有 regex 的风格, 除了那些少数不支持引用的。当您开始做一些不适合 "match the text matched by a previous capturing group 与以前的捕获组匹配的文本" 作业描述的内容时, 执行的风格会有所不同。
8 T. {8 D! |/ U0 F8 R8 R, l( `" M5 P! P: V) l. s
引用与不匹配的捕获组之间存在差异, 而对不参与匹配的捕获组则有一个不同。regex (q?)b\1 匹配 b。 q?是可选的并且不匹配, 导致 (q?)成功地匹配和捕获任何东西。b 匹配 b, \1 成功匹配了组捕获的任何东西。) _, h4 C, D, x' W
' s% h; M; K( ?
regex (q)?b\1 未能匹配 b. (q) 根本无法匹配, 因此该组根本无法捕获任何东西。由于整个组是可选的, 因此引擎将继续匹配 b。该引擎现在到达 \1, 它引用了一个没有参与匹配尝试的组。这会导致引用无法完全匹配, 从而模仿组的结果。因为没有 ?使 \1 可选, 总体匹配尝试失败。- ^' z  s/ o2 p/ B
+ S' F" G( e" x
Backreferences to Non-Existent Capturing Groups 引用到不存在的捕获组
* g& G$ p3 M9 D) g
( A, X$ j$ f7 u$ `( N1 k引用不存在的组 如 (one)\7 是错误的。如果捕获组少于两位数字, 则后跟两位数字的反斜线将形成一个数字引用, 后跟一个字面值。所以 (one)\12 匹配 oneone2。
8 [! O1 \5 h( \2 D& {3 ]
' C2 c. w+ |4 t4 cForward References 正向引用. a1 c& `' {+ d: O5 x* Z) s

$ A% y7 Y3 X* q8 n* SPowerGREP 允许您对在 regex 中稍后出现的组使用引用。如果正向引用在重复的组内, 则显然有用。然后, 在该组已经匹配后, regex 引擎会对引用进行评估。在尝试组之前, 引用失败, 就像引用失败的组一样。
, ?4 C' E' Y) q) {, Q5 J; f$ ?7 r/ x( {" L% R5 y
regex (\2two|(one))+ 匹配 oneonetwo。在字符串的开头, \2 失败。尝试另一个选择, one是由第二个捕获组匹配的, 随后是第一个组。第一组然后重复。这一次, \2 匹配第二个组捕获的one。two然后匹配two。在第一组的两次重复中, regex 与整个主题字符串匹配。3 j6 G, Z9 i1 y& ~! V0 ?  c

- U2 r8 Z0 @, `  T, ]Nested References 嵌套引用2 c- E/ ?! P; K2 ^" k$ ^
: o7 ?1 v% e: o4 K: Q4 J) q
嵌套引用是它所引用的捕获组内的引用。与前向引用一样, 嵌套引用只有在重复的组内才有用, 如中所示 (\1two|(one))+。当支持嵌套引用时, 此 regex 也与 oneonetwo 匹配。在字符串的开头, \1 失败。尝试另一个选择, one是由第二个捕获组匹配的, 随后是第一个组。第一组然后重复。这一次, \1 匹配第一个组的最后one迭代捕获one。regex 引擎重新进入第一组并不重要。组匹配的文本在先前退出组时存储在引用中。two然后匹配two。在第一组的两次重复中, regex 与整个主题字符串匹配。如果在匹配后检索捕获组中的文本, 则第一组存储 onetwo, 而第二个组在字符串中捕获第一个one。

该用户从未签到

 楼主| 发表于 2017-12-7 16:18:52 | 显示全部楼层
Matching Nested Constructs with Balancing Groups 将嵌套结构与平衡组匹配
9 j2 O* M" L" F& _. f1 G0 G9 x
/ y5 L0 D+ [& v* D6 S" m2 VPowerGREP 有一个特殊的功能, 称为平衡组。平衡组的主要目的是匹配平衡的构造或嵌套的构造, 它们从哪里得到它们的名字。该功能的一个技术上更准确的名称是捕获组减法。这就是它的真正功能。此功能最初是由. NET regex 风格发明的, 它不支持regular expression recursion正则表达式递归。
* O2 q1 X$ r/ y% |1 \(?<capture-subtract>;regex)或(?'capture-subtract'regex)是平衡组的基本语法。它与命名的捕获组使用的语法相同, 但两个组名由减号分隔。该组的名称为 “capture 捕获"。当 "regex" 匹配时, 该匹配存储在 “capture 捕获" 的名称下。这与正常命名的捕获组没有什么不同。您可以省略组的名称。(?<-subtract>regex) 或 (?'-subtract'regex) 是捕获平衡组的语法。
5 j) y/ s1 x* W名称 “subtract 减法" 必须是 regex 中另一个组的名称。当 regex 引擎进入平衡组时, 它从组 “subtract 减法" 中减去一个匹配项。如果组 “subtract 减法" 尚未匹配, 或者它的所有匹配项已被减去, 则平衡组将无法匹配。您可以将平衡组看作是一个条件, 它测试组 “subtract 减法", 将 "regex" 作为 "if" 部分, 而 "else" 部分总是无法匹配。不同之处在于, 平衡组具有从组 “subtract 减法" 中减去一个匹配项的附加特征, 而条件则使该组未触及。
/ I0 {' [+ ~& E* w# PLooking Inside The Regex Engine查看 Regex 引擎的内部
- `; g* [+ f; W- N1 Y8 ?  r) u; }# m0 J
让我们应用 regex (?'open'o)+(?'-open'c)+ 去匹配 ooccc。(?'open'o) 匹配第一个 o 和存储,作为第一次捕获的组 "open".  quantifier + 重复该组。 (?'open'o) 匹配第二个 o 并将其存储为第二个捕获。再次重复,(?'open'o) 无法匹配第一个 c. 但 + 满足两个重复。
, J1 x3 b$ t- xregex 引擎前进到 (?'-open'c)。在引擎可以进入这个平衡组之前, 它必须检查减去组 "open" 是否捕获了什么。它有。引擎进入组, 从 "open" 中减去最近的捕获。这使得组 "open", 第一 o 作为其唯一的捕获。现在在平衡组中, c 匹配 c。引擎退出平衡组。因为在连字符之前没有指定名称, 所以没有捕获任何东西。平衡组也有 + 作为它的量词。引擎再次发现, 减去组 "open" 捕获的东西。正则表达式进入平衡组, 使组 "打开" 而不进行任何匹配。c 与字符串中的第二个 c 匹配。5 }, X" j) V/ ^+ e" y
平衡组再次重复。但这一次, regex 引擎发现组 "open" 没有匹配项。平衡组无法匹配。但 + 是满足两个迭代。引擎已到达 regex 的末尾。它返回 oocc 作为整体匹配。Match.Groups['open']。Success 将返回 false, 因为该组的所有捕获都被减去。
3 e# o( A. Z9 y, D. p7 s* }Matching Balanced Pairs 匹配平衡对
% j& q1 w; e9 P3 x$ H9 q" i
! @- x- W  R5 n1 m9 U& U; j* c我们需要修改这个 regex, 如果我们想它匹配的 o's 和 c’s 平衡数。为了确保 regex 不匹配 ooccc, 它的 c's 大于 o's, 我们可以添加anchors定位点: ^(?'open'o)+(?'-open'c)+$。此 regex 经过与前一个相同的匹配过程。但之后 (?'-open'c)+ 无法匹配其第三次迭代, 引擎将达到 $, 而不是 regex 的末尾。此操作无法匹配。regex 引擎将回溯尝试不同的量词排列, 但它们都无法匹配。无法找到匹配项。7 D) W6 Z. f7 k5 K7 P# g8 k/ w; \
# l$ U- |7 M7 F, ~
但 ^(?'open'o)+(?'-open'c)+$ 仍然匹配 ooc。匹配的过程再次相同, 直到平衡组与第一个 c 匹配, 并将组 "open" 与第一个 o 作为其唯一捕获。限定符使引擎再次尝试平衡组。引擎再次发现, 减去组 "open" 捕获的东西。正则表达式进入平衡组, 使组 "open" 而不进行任何匹配。但是现在, c 无法匹配, 因为 regex 引擎已到达字符串的末尾。
9 S! Q$ A! b, h/ y
- I: ?# |. d. o  kregex 引擎现在必须从平衡组中返回。当回溯平衡组时, PowerGREP 也回溯减法。由于第一个 o 的捕获是在进入平衡组时从 "open" 中减去的, 因此现在在退出平衡组时将恢复此捕获。重复组 (?'-open'c)+ 现在已减少为单个迭代。但量词是好的, 因为 + 它总是意味着 "一次或更多"。在字符串的末尾, regex 引擎在正则表达式中达到 $ 匹配。整个字符串 ooc 作为整体匹配返回。Match.Groups['open']。捕获将字符串中的第一个 o 作为 CaptureCollection 中的唯一项。这是因为, 在回溯后, 第二个 o 从组中减去, 但第一个 o 不是。4 s0 \6 x2 o. I9 J- U; F

) z. E1 U  {5 _# o! ]+ n9 z/ e+ g为了确保正则表达式与 oc 和 oocc 匹配, 而不是 ooc, 我们需要检查当匹配进程到达 regex 末尾时, 组 "open" 没有任何捕获。我们可以设置条件的做到。(?(open)(?!))是一个条件, 用于检查组 "open" 是否匹配某项。在 PowerGREP 中, 有匹配的东西意味着仍然在堆栈上没有回溯或减去的捕获。如果该组已捕获了某些内容, 则会计算条件的 "if" 部分。在这种情况下, 是空的负预测先行(?!),此前预测中的空字符串始终匹配。因为前瞻性是负的, 这会导致预测先行总是失败。因此, 如果组捕获了某些东西, 则条件总是失败。如果组没有捕获任何内容, 则对条件的 "else" 部分进行计算。在这种情况下, 没有 "else" 部分。这意味着如果组没有捕获到某些东西, 则条件总是成功。这使 (?(open)(?!))一个正确的测试, 以验证组 "open" 没有捕获剩余。
! \' z- A5 s+ ^; C" v
7 |/ U* n: N' Z% t. D^(?'open'o)+(?'-open'c)+(?(open)(?!))$无法匹配 ooc。当 c 无法匹配时, 由于 regex 引擎已到达字符串的末尾, 因此引擎回溯出平衡组, 并将 "open" 保留为单个捕获。正则表达式引擎现在到达条件, 无法匹配。regex 引擎将回溯尝试不同的量词排列, 但它们都无法匹配。无法找到匹配项。
9 _# o) h9 B$ D4 B: E# p8 [5 ^7 O: N& r$ K7 j
^(?'open'o)+(?'-open'c)+(?(open)(?!))$匹配oocc。然后 (?'-open'c)+ 已匹配 cc, 正则表达式引擎不能第三次进入平衡组, 因为 "open" 没有捕获。引擎前进到条件。条件成功, 因为 "open" 没有剩余的捕获, 条件也没有 "else" 部分。现在 $  匹配在字符串的末尾。
) H2 r$ L0 r, K6 @! w6 _* ^* n4 [" y$ b% h9 P5 s0 ]. i( e' ~
Matching Balanced Constructs 匹配平衡结构
* C8 z  G0 M3 b2 d) E# r
8 x) D" b3 X. a) ^) @2 T* X^(?:(?'open'o)+(?'-open'c)+)+(?(open)(?!))$ 将捕获组和平衡组封装在一个捕获组中, 也会重复。此 regex 匹配任何类似 ooocooccocccoc 的字符串, 其中包含任意数量的完全平衡的 o 和 c, 任意数量的对按顺序排列, 嵌套到任意深度。平衡组确保 regex 永远不会匹配字符串中的任何点上的 c 的字符串, 它的左边有 o 的位置。结束时必须保持在重复组之外的条件, 确保 regex 永远不匹配具有大于 c 的字符串。
" K( w$ V2 x- C" C4 D+ B; K2 S^(?>(?'open'o)+(?'-open'c)+)+(?(open)(?!))$ 通过使用atomic group 原子组而不是捕获组来优化上一个 regex。当正则表达式找不到匹配时, 原子组也捕获, 消除了几乎所有的回溯, 这可以大大提高在使用大量 o 和 c 的长字符串时的性能, 但最终没有适当的平衡。原子组不会更改 regex 如何匹配具有平衡 o 和 c 的字符串。% x% V( s6 Z! R6 o
m*(?>(?>(?'open'o)m*)+(?>(?'-open'c)m*)+)+(?(open)(?!))$ 允许任意数量的字母 m 在字符串的任何地方, 而仍然需要所有 o 和 c 的平衡。在正则表达式的起始处允许任何数量的 m* 在第一个 o前。(?'open'o)+被改成 (?>(?'open'o)m*)+, 以允许任何数量的 m 在 o后。同样的, (?'-open'c)+ 被更改为 (?>(?'-open'c)m*)+ 允许任何数量的 m 在每个 c 之后。 ; T0 K' G& ?) P- P3 q  ^$ n
这是使用 PowerGREP 的平衡组或捕获组减法特征来匹配平衡结构的一般解决方案。可以用任何正则表达式替换 o, m 和 c,只要这些三中没有两个可以匹配相同的文本。" [0 [+ q7 a0 V. x- O* i
^[^()]*(?>(?>(?'open'\()[^()]*)+(?>(?'-open'\))[^()]*)+)+(?(open)(?!))$应用此技术匹配一个字符串, 其中所有括号都是完全平衡的。: W; O8 z. V& c6 ]  @# F* w' o0 U
Backreferences To Subtracted Groups 引用减去组; [- d, S# {, m6 ~7 f. o6 n

0 e' H( E5 Q! S9 z8 A! w您可以将引用用于由平衡组减去其匹配项的组。引用匹配该组的最新匹配, 而不是回溯或减去。regex (?'x'[ab]){2}(?'-x')\k'x'匹配 aab, abb, baa, 或 bba。它不符合匹配。字符串的第一和第三个字母必须相同。2 u6 H: ]( P4 G+ z
- Q! m7 y# v0 z+ P. C3 t8 h
让我们看看(?'x'[ab]){2}(?'-x')\k'x'如何匹配 aba。第一次迭代 (?'x'[ab]) 捕获 a。第二个迭代捕获 b。现在 regex 引擎到达平衡组 (?'-x')。它检查组 "x" 是否匹配, 它有。引擎进入平衡组, 从组 "x" 的堆栈中减去匹配 b。平衡组中没有 regex 标记。它的匹配没有通过字符串前进。现在正则表达式引擎到达引用 \k'x'。组 "x" 的堆栈顶部的匹配是。字符串中的下一个字符也是引用匹配的 a。aba 被认为是一个整体的匹配。
8 V- z7 ]9 O: K6 B, E) ?4 ^. \9 @3 K  ?
当您将此 regex 应用于 abb 时, 匹配的进程是相同的, 只是引用无法匹配字符串中的第二个 b。由于 regex 没有其他的排列, 正则表达式引擎可以尝试, 因此匹配尝试失败。
" ], n. s0 s9 k- Y2 N8 a3 l4 ~
4 V) X8 n7 U' g# f$ i  UMatching Palindromes 匹配回文& U/ ~+ _- O, u! ~# r
4 \& Q; N! x  K5 `% T
^(?'letter'[a-z])+[a-z]?(?:\k'letter'(?'-letter'))+(?(letter)(?!))$匹配任何长度的回文。这个正则表达式充分利用了引用和捕获组减法。它还在上一节中使用一个空平衡组作为 regex。
0 y7 o6 S: k  m  |; L: s
. |; `  }4 q( ~: L* K让我们看看这个 regex 是如何匹配回文radar。^ 匹配在字符串的开头。然后 (?'letter'[a-z])+ 循环五次。组 "letter" 结束时, 其堆栈上有五匹配项:r, a, d, a, 和 r。正则表达式引擎现在位于字符串的末尾并且位于 [a-z]? 上。在 regex 中。它不匹配, 但这很好, 因为量词使它可选。引擎现在到达\k'letter'。组 "letter" 有 r 在其栈的顶部。这无法匹配字符串末尾后的 void。) e5 ]* V$ X* N
! j1 G/ _( s$ y7 X: V5 [! F. ~
regex 引擎回溯。(?'letter'[a-z])+ 减少到四次迭代, 在组 “letter" 的堆栈上留下 r, a, d, 和 a 。[a-z]?匹配 r。引用再次未能匹配的空白后, 字符串的末尾。引擎回溯, 迫使 [a-z]?放弃匹配现在 "letter" 有一个在其栈顶部。这将导致引用无法匹配 r。" [2 m9 w: ~' g  T% L' v
# Q! L  C7 k6 ]+ h1 G, A8 k9 _
更多回溯如下。(?'letter'[a-z])+将减少为三次迭代, 在组 “letter" 的堆栈顶部保留 d。引擎再继续使用 [a-z]?。它再次失败, 因为没有 d 引用匹配。
. R% Q* r& }7 W% w) e2 v. i, N, x7 R- Y% A3 T; h) Q3 {& ?
再次回溯, 将组 "letter" 的捕获栈还原为 r 和 a。现在形势变成[a-z]?匹配 d。引用匹配的是组 "letter" 中最近的匹配项, 而不是回溯。引擎现在到达空平衡组 (?'-letter')。此匹配, 因为组 "letter" 有一个要减去的匹配 a。
( |! j2 y: G' v$ }; n! j
9 G2 b2 H/ q6 V- x: Z7 a后向引用和均衡组内重复非捕获组,因此引擎试再一遍。后向引用匹配 r 和平衡组减去它从“letter”的叠加,使得捕获组没有任何匹配。重复一次,后向引用失败,因为该组“letter”对其堆栈没有匹配。这使得该组充当非捕获组。反向引用非捕获组始终在PowerGREP失败。4 A3 i$ }7 G0 p1 B$ L
+ ~/ X- A+ Z9 G
(?:\k'letter'(?'-letter'))+ 成功匹配了两个迭代。现在,条件(?(letter)(?!)) 成功是因为组 "letter" 没有匹配左边. 锚 $ 也匹配. 回文radar已匹配。

该用户从未签到

 楼主| 发表于 2017-12-7 16:19:28 | 显示全部楼层
Use Parentheses for Grouping and Capturing 使用括号进行分组和捕获
" S# T. ]2 a/ P) X; `
* }/ y8 T4 u7 Y) q  j& H通过将正则表达式的一部分放在圆括号或圆括号中, 可以将正则表达式的一部分组合在一起。这使您可以将quantifier限定符应用于整个组, 或限制对部分 regex 的alternation替换。% Y* |- c: x3 c. t: d) t' Y
# S$ h  d1 H0 l. w* B
只有括号可以用于分组。方括号定义一个character class字符类, 而花括号则由具有quantifier with specific limits特定限制的限定符使用。( g' |+ k9 M; M2 f0 y

& v* }, s/ K- zParentheses Create Numbered Capturing Groups 括号创建编号的捕获组  Y8 i, K0 {" h6 l! J1 t

3 E2 ]# ^8 ]# F* v2 F  ^8 K4 `除了将正则表达式的一部分组合在一起外, 括号还创建一个编号的捕获组。它存储字符串中由正则表达式部分匹配的括号内的部分。8 \0 X. J; P+ f. `
7 r/ e2 `' w* Y4 l2 y8 E
regex Set(Value)? 匹配Set或 SetValue。在第一种情况下, 第一个 (且唯一的) 捕获组保持为空。在第二种情况下, 第一个捕获组与Value值匹配。
* i( _9 U% d* h  ]4 s. F! E- z" W5 V* A$ u& {: p5 h( J: K7 O, @
Non-Capturing Groups 非捕获组
8 V; j0 ?" m$ |7 v5 j( A8 I1 g+ |4 i! ~+ r" F/ L1 m/ j
如果不需要该组来捕获其匹配, 则可以将此正则表达式优化为 Set(?:Value)?。左括号后的问号和冒号是创建捕获组的语法。开口括号后的问号与 regex 末尾的问号无关。最后一个问号是使上一个标记可选的限定符。此限定符不能出现在左括号后, 因为在组开始时没有可选的。因此, 问号作为运算符使标记可选和问号作为捕获组的语法的一部分是不存在歧义的, 尽管这在一开始可能会很混乱。还有其他类型的组使用与本教程后面解释的冒号 (?与其他字符相结合的语法)。5 a2 O5 q, ?$ x( P0 o: q; E
( R5 H5 ?% m1 S6 B& b
color=(?:red|green|blue) 是另一个具有捕获组的 regex。此 regex 没有限定符。/ D, b# i! _! v7 C) F2 z& i% }
Using Text Matched By Capturing Groups 使用捕获组匹配的文本" `( S" F1 n; W) t6 w1 U8 h
( i8 C( D" S' b; x$ T, M# i5 D3 ~. J, ]
捕获组使提取部分 regex 匹配变得容易。可以通过引用在正则表达式中backreference重用文本。引用也可以用于替换字符串。有关详细信息, 请查看eplacement text tutorial替换文本教程。

该用户从未签到

 楼主| 发表于 2017-12-7 17:28:21 | 显示全部楼层
Branch Reset Groups 分支重置组
: X0 Z9 i+ V2 ~: r
4 j5 ]9 Q; \; R4 RAlternatives分支重置组中的替代项共享相同的捕获组。语法是 (?|regex) 在哪里 (?| 打开组和 regex 是任何正则表达式。如果在分支重置组中不使用任何替换或捕获组, 则其特殊功能不起作用。然后, 它充当一个non-capturing group捕获组。
9 w$ a# Q* Z6 E( W: b  N9 s) xregex (?|(a)|(b)|(c)) 由一个单一的分支重置组组成, 有三备选方案。此 regex 与 a, b, 或 c 匹配。regex 只有一个捕获组, 其编号为 $1, 由所有三备选方案共享。比赛后, 1 美元持有 a, b, 或 c。5 w8 U0 R5 y# f5 ?9 f4 Z2 i: e) @+ |% N
将其与 regex (a)|(b)|(c) 缺少分行复位组。此 regex 也与 a, b, 或 c匹配。但它有三捕获组。匹配结束后, $1对应 a 或完全没有, $2对应 b 或完全没有, 而$3对应 c 或完全没有。4 z5 U6 ]$ f2 @/ O2 Y% l
; K$ L# n! M% i
Backreferences引用在分支重置组内捕获组的工作就像你期望的那样。(?|(a)|(b)|(c))\1 匹配 aa, bb, 或 cc。由于分支重置组中只有一个选项可以匹配, 因此参与匹配的替代项决定了捕获组所存储的文本, 从而确定了由引用匹配的文本。
* `! W( A. t: l2 D9 a7 n7 |, I9 `3 [4 c* s
分支重置组中的替代项不需要具有相同数量的捕获组。(?|abc|(d)(e)(f)|g(h)i) 有三捕获组。当此 regex 与 abc 匹配时, 所有三组都为空。当 def 匹配时, $1 对应 d, $2 对应 e 和 $3 对应 f。当 ghi 匹配时, $1 对应 h, 而其他两个则为空。
3 h# W6 N- c; u* {6 m' K0 N3 ], n. Y+ q/ @3 h" w
可以在分支重置组之前和之后捕获组。分支重置组之前的组照常编号。分支重置组中的组在分支重置组之前的组中继续编号, 每个替代重置该数字。分支重置组之后的组从其他组中继续编号, 即使这不是最后一个选择。那么 (x)(?|abc|(d)(e)(f)|g(h)i)(y) 定义了五捕获组。(x) 是组1、(d) 和  (h) 是组 2, (e) 是组 3, (f) 是组 4, (y) 是组5。4 f) [! ?1 m, \0 H( x6 }$ v

$ ]' r& T$ B- g: i: D* H: H
% s8 i' A3 |2 f: LNamed Capturing Groups in Branch Reset Groups 分支重置组中的命名捕获组
$ B  S/ O# n8 ]" m
8 X9 W2 p! ^5 q9 J! {! _1 l可以在分支重置组中使用named capturing groups命名捕获组。您必须在每个备选方案中使用相同的组名称。不匹配的组名是一个错误。
( e( h, `- E, B2 z  c/ o(?'before'x)(?|abc|(?'left'd)(?'middle'e)(?'right'f)|g(?'left'h)i)(?'after'y)之后的表达式与前面的 regex 相同。它命名五组 "before", "left", "middle", "right", 和 "after"。请注意, 由于第三备选方案只有一个捕获组, 因此必须是其他备选方案中第一组的名称。: A6 m2 t( U8 Y
如果在某些备选方案中省略这些名称, 则组仍将与其他选项共享这些名称。在 regex (?'before'x)(?|abc|(?'left'd)(?'middle'e)(?'right'f)|g(h)i)(?'after'y)中 (h) 仍然命名为 "left" ,因为分支重置组使其共享名称和数字 (?'left'd)。
& l6 A4 ~, b7 L, l2 g& g) B! Y在 PowerGREP 中, 具有相同名称的组总是被视为一个和同一组。因此, 在使用命名捕获组时, 您并不真正需要在 PowerGREP 中使用分支重置组。% M4 ^0 j# N. I. N- ?! @
Day and Month with Accurate Number of Days 日和月数准确天数
( ^/ b9 ~3 x* a8 M  C4 [$ V( w7 D/ W
该是举一个更实际的例子的时候了。这两个正则表达式以 m/d 或 mm/dd 格式匹配日期。它们排除了无效的日期, 如2/31。
: @$ _0 r* _( D5 V/ E# J/ _" [( S* ^. ~: y3 {- F4 Y
^(?:(0?[13578]|1[02])/([012]?[0-9]|3[01]) # 31 days
; p; H3 P7 d4 [- D% _ |  (0?[469]|11)/([012]?[0-9]|30)         # 30 days: _- j+ s* i; I$ F( s
|  (0?2)/([012]?[0-9])                   # 29 days
6 R9 c  p( N1 ` )$
! F8 j/ V3 n. O3 V7 X# W" h第一个版本使用non-capturing group捕获组 (?:...) 将备选方案分组。它有六**的捕获组。$1及$2将会以每月31天、$3 和 $4 为每月30天、$5及 $6 只用于2月。( u$ P  ^. G' b% D  X
^(?|(0?[13578]|1[02])/([012]?[0-9]|3[01]) # 31 days
5 j2 `* a2 C- P) c6 J3 O; U5 ^ |  (0?[469]|11)/([012]?[0-9]|30)         # 30 days
- ?  q1 G! _3 V/ @ |  (0?2)/([012]?[0-9])                   # 29 days4 E# n: e" b. n* U5 U7 Y
)$
) t9 K4 ~% e4 U3 j; X第二个版本使用分支重置组(?|…)对替代项进行分组并合并它们的捕获组。现在只有两个捕获组在树选项之间共享。在找到匹配项时, $1始终保持该月份, 而2始终保持该日期, 而不考虑月份中的天数。

该用户从未签到

 楼主| 发表于 2017-12-7 17:28:31 | 显示全部楼层
Repeating a Capturing Group vs. Capturing a Repeated Group 重复捕获组与捕获重复组/ K4 q' {5 x( P7 q- y% R

" p* |3 K3 G' I$ ~( P当创建需要capturing group捕获组的正则表达式来获取匹配的部分文本时, 常见的错误是repeat重复捕获组而不是捕获重复的组。不同之处在于, 重复捕获组只捕获最后一个迭代, 而捕获另一个重复组的组将捕获所有迭代。一个例子将说明这一点。0 _; Q+ `; ^: a4 E. P
% [& q$ v6 f! j& p6 K
比方说, 你想匹配的标签像 !abc! 或者 !123!。只有这两个是可能的, 你想捕获的 abc 或 123, 找出你有什么标签。那就够简单了:!(abc|123)!会做的把戏。
5 v" G) B; p2 L1 g( i1 H5 E  d) P8 e. {/ {7 _. p' j+ j5 k* `! T- S
现在, 让我们说, 标签可以包含 abc 和 123的多个序列, 像 !abc123!或者 !123abcabc!。快速简便的解决方案是 !(abc|123)+!。此正则表达式将确实匹配这些标记。但是, 它不再满足我们的要求, 将标签的标签捕获到捕获组中。当这个 regex 匹配 !abc123!, 捕获组只存储 123。当它匹配 !123abcabc!, 它只存储 abc。" U: [- m0 o0 C5 e

% F' S% \  O% Q! N- ~这是很容易理解的, 如果我们看看如何应用 regex 引擎!(abc|123)+!匹配!abc123!。首先 ! 匹配 !。然后引擎进入捕获组。它注意到当引擎到达主题字符串中第一个和第二个字符之间的位置时, 就会输入捕获组 #1。组中的第一个标记是 abc, 它与 abc 匹配。找到了匹配项, 因此第二种选择没有尝试。(引擎确实存储了一个回溯位置, 但此示例中不使用此方法。引擎现在离开捕获组。它注意到当引擎到达字符串中第四和第五个字符之间的位置时, 捕获组 #1 已退出。
3 i/ }. g" Q1 ^  C/ K( W
' T( W) v2 i5 f, R, [6 g从组中退出后, 引擎会注意到plus加号。加号是贪婪的, 因此该组再次尝试。引擎再次进入该组, 并注意到在字符串中的第四和第五个字符之间输入了捕获组 #1。它还指出, 由于加号不是占有, 它可能是回溯。即, 如果该组不能第二次匹配, 那就好了。在此回溯注释中, regex 引擎还在组的上一个迭代期间保存组的入口和退出位置。
) a0 G& B3 N, P3 H' i& A" K! [' S* [  x- X
abc 无法匹配 123, 但123成功。该组再次退出。存储字符7和8之间的退出位置。
& Z3 K# y. K4 z7 m! N& q
. n. j: q5 M. @6 K$ x* p加号允许另一个迭代, 因此引擎再次尝试。将存储回溯信息, 并保存该组的新入口位置。但现在, abc 和 123都无法匹配 !。该组失败, 引擎回溯。回溯时, 引擎将恢复组的捕获位置。即, 在字符4和5之间输入了组, 并在字符7和8之间存在。
6 K# W" W) z4 A. Y" X, D$ I" {& \  o, A$ [5 l7 |+ J
引擎继续!, 匹配!。找到一个整体匹配。整体匹配跨越整个主题字符串。捕获组空间字符5、6和 7, 或123。在找到匹配项时将丢弃回溯信息, 因此, 在该组有一个与 abc 匹配的前一个迭代之后, 无法判断其是否存在。3 V: `2 z$ f9 S- |3 V' c; b
7 t; {% @( F5 u7 A4 L
在这个例子中捕获 abc123 的解决方案应该是显而易见的: 正则表达式引擎应该只进入并离开组一次。这意味着加号应该位于捕获组内, 而不是外部。由于我们需要对两个选项进行分组, 因此需要在重复的组**围放置第二个捕获组:!((abc|123)+)!当这个 regex 匹配abc123!, 捕获组 #1 将存储 abc123, 组 #2 将存储123。由于我们对内部组的匹配不感兴趣, 我们可以通过使内部组捕获来优化这个正则表达式:!((?:abc|123)+)!。

该用户从未签到

 楼主| 发表于 2017-12-7 17:52:58 | 显示全部楼层
Text Cursor Configuration 文本游标配置
* D; s* G2 a' ^8 D0 l& m0 s1 v0 s6 h' [/ T
通过单击 "text cursor appearance 文本光标外观" 部分中的 “Configure 配置" 按钮之一, 可以从 "文本布局" 配置屏幕中访问 " text layout configuration screen 文本光标配置屏幕" 。
9 N( ^* e2 M% c8 \- v+ i- J
- S, V, T1 R* l4 a& ^4 M( P1 {+ yExisting Text Cursor Configurations 当前文本游标配置2 w& w6 q' g# K% r( s% Q3 @

. C1 V. R9 R; `8 O8 D, [; [6 ^"文本光标配置" 屏幕显示您在顶部的列表中选择的文本光标配置的详细信息。在屏幕上所做的任何更改都将自动应用于选定的游标, 并在列表中选择不同的游标时保持不变。单击 "确定" 后, 更改将变为永久性的。单击 "确定" 时在列表中选择的光标将成为新的默认游标。
( ^8 q* Z7 b' j, U/ R4 D: a+ K
( j6 x# S+ D. m% A单击 “New 新建" 和 “Delete 删除" 按钮以添加或删除游标。必须至少有一个文本游标配置。如果您有多个, 可以使用 "上" 和 "下" 按钮更改其顺序。该顺序不会影响文本游标配置在选择列表中出现的顺序以外的任何内容。
, j# x) w2 A* w
5 P$ D; W5 o9 u( ]5 IPowerGREP 附带了许多预配置的文本游标。如果不喜欢, 可以完全编辑或删除所有预配置的文本游标。+ v( p* W% p- E: j+ b
*  插入光标: 闪烁的垂直条类似于标准的 Windows 游标, 但它是更厚和完全黑色, 即使在灰色背景。/ ?/ Y: c* W( ^4 z( I4 v
* 双向插入光标: 与插入光标类似, 但带有一个小标志, 指示键盘布局是从左向右 (例如, 您是用**绑定的) 还是从右向左 (例如, 您键入的是希伯来语)。即使没有安装任何从右向左的布局, 该标志也比使用标准 Windows 游标所得到的要大。) _" M) W$ A* s
* 底线光标: 位于字符下方的水平条闪烁。这模仿了 DOS 应用程序中常见的文本游标。1 k7 l( \8 B% u$ R' E( }( W
* 覆盖光标: 包含字符下半部分的闪烁矩形。在 EditPad 中, 这是覆盖模式的默认游标。在此模式下, 使用键盘上的插入键进行切换, 键入文本将改写以下字符, 而不是将其向前推。5 u' P! A8 g& x+ E0 N
* 标准视窗光标: 标准视窗光标是一个非常薄的闪烁垂直条, 是在屏幕上的 XOR, 使它很难看到任何东西, 除了纯黑色或纯白色背景。如果安装了从右向左的键盘布局, 光标将获得一个指示键盘方向的小标志。如果您依赖辅助功能软件 (如屏幕阅读器或缩放工具) 无法跟踪 EditPad 的其他光标形状, 则应仅使用此游标。
. U( @) ?. }/ w) B2 C9 T4 c1 PSelected Text Cursor Configuration 选定的文本游标配置
/ `9 ~2 g, P% l# J4 c
7 R6 A. l1 L9 z) m% i4 f  ?. Q键入文本游标配置的名称。此名称仅用于在准备多个文本游标配置时帮助您在选择列表中标识它。! L9 l# t) W/ |7 G8 g

, A% X& u# T, j; p* P在 "Example 示例" 框中, 您可以键入一些文本, 以查看光标的外观。该框中有一个拉丁语和阿拉伯语的单词, 因此您可以根据光标所在单词的文本方向来查看光标外观 (如果有) 的差异。
& y/ u+ I8 s2 w5 V5 t
3 N1 T" }- r$ L; v8 ^3 l5 aShape 形状# k: L( U4 f) N. |3 s
3 d* O" G( }  v& U# O* k
* 标准 windows 文本光标: 标准的 windows 光标是一个非常薄的闪烁垂直条, 是在屏幕上 XOR, 使它很难看到任何东西, 除了纯黑色或纯白色背景。如果安装了从右向左的键盘布局, 光标将获得一个指示键盘方向的小标志。如果您依赖辅助功能软件 (如屏幕阅读器或缩放工具) 无法跟踪 EditPad 的其他光标形状, 则应仅使用此游标。标准的 Windows 游标不提供配置选项。% ?/ {+ K+ o0 E4 c# _
* 字符前面的竖线: 在 Windows 平台上, "普通光标" 形状是位于它所指向的字符前面的垂直条。该字符左侧为从左向右文本, 从右向左文本的字符右侧。
( q+ o2 P: @1 x. A* 带有指示键盘方向的标志的竖线: 一个垂直的条形图, 位于它指向的字符前面, 顶端有一个小标志 (三角形), 指示活动键盘布局的方向。当光标指向从左向右文本中的字符时, 它将放在该字符的左侧。当光标指向从右向左文字的字符时, 它将放在该字符的右侧。游标标志的方向与光标下的文本无关。当活动键盘布局用于从左向右的语言时, 光标的标志指向右侧。当活动键盘布局用于从右向左语言时, 光标的标志指向左侧。
, m2 W/ [2 B/ Q  `6 ~* 带有指示文字方向的标志的竖线: 一个垂直的条形图, 位于它指向的字符前面, 顶端有一个指向该字符的小的标志 (三角形)。当光标指向从左向右文本中的字符时, 它将被放置在该字符的左侧, 并将其标志指向该字符的右侧。当光标指向从右向左文本中的字符时, 它将被放置在该字符的右侧, 并将其标志向左指向该字符。
# D% U% l2 Z. d: I5 ^* 水平条下的字符: 在 DOS 应用程序中, 游标是光标指向的字符下的水平线。
' m0 v8 H: x0 A6 ~: L* 半矩形覆盖一半字符: 光标覆盖其指向的字符的下半部分。这是一个传统的游标形状, 用于指示键入将改写字符而不是向前推。
( M& e) f3 b5 \" q" V( e* 矩形覆盖整个字符: 光标使字符不可见。这也可用于指示覆盖模式。+ J2 G  d" `' ]$ \/ T
Blinking Style 闪烁样式5 G4 c( t4 d( D2 K
5 S$ B1 I! u- P9 Y0 a
* 不要眨眼: 游标以单一颜色永久可见。如果闪烁使您分心, 或者它混淆了辅助功能软件 (如屏幕阅读器或放大工具), 请选择此选项。
6 ^  m" N, v' E' m9 L1 R* 闪烁开/关: Windows 平台上的文本光标通常闪烁的样式。当您键入 (快速) 时, 游标将永久可见。当您停止键入大约半秒钟时, 光标通过变为暂时不可见而闪烁。闪烁会使您的眼睛在一大块文本中定位光标更容易。
$ s2 t1 ?5 I. @7 a7 Z* 在两种颜色之间交替: 当您停止键入时, 光标会闪烁。而不是使光标不可见, 它以交替的颜色显示。此选项使光标的最大可见性: 闪烁的动画吸引眼球, 同时保持光标的永久可见。
+ @0 ?* A5 ~% P( }- u! NSizes 大小  m# q7 c2 P1 z: d7 Y
* p* K) u, D* }) S; ^. g
* 宽度: 垂直条形图形状的宽度 (以像素为单位)。( b2 {9 z' V2 q  ~
* 高度: 水平条形图形状的高度 (以像素为单位)。5 h( @+ y( h$ e3 O4 I5 L& d
* 标志: 指示文本方向的标志边缘的长度 (以像素为单位)。
6 r8 L8 u: V0 |7 D! H" kColors 颜色2 K1 s! W& y3 W) {& z, d
  u; ?7 {4 U: ]. \! k5 ^) [1 ?& `
* 常规: 用于除标准 Windows 游标外的所有形状和闪烁样式。
  E& }+ z  N$ a; H( F* 交替: 交替使用颜色的 "交替两种颜色" 闪烁的风格。( t$ R5 \& u4 h) j$ z' g) N$ p  h
* 拖动: 使用鼠标拖动和删除文本时出现的第二个 "幽灵" 光标的颜色。它指示在释放鼠标按钮时文本**或复制到的位置。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

小黑屋|手机版|Archiver|PDAWIKI |网站地图

GMT+8, 2024-4-20 03:28 , Processed in 0.036325 second(s), 5 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表