.. SPDX-License-Identifier:	CC-BY-NC-SA-4.0

解析：Exppattern
================

所谓Exppattern，类似于各大编程语言中的正则表达式。不过和正则表达式不同的是，正则匹配的是字符串，而Exppattern匹配的对象是一张张卡牌。通过Exppattern可以判断各种卡牌的情况，比如这张牌是否符合“既是红桃，也是点数3-5的牌”等等一系列复杂的规则。

你可能也已经注意到了，在不少Room中的askFor...函数中，出现了很多次pattern参数。这个pattern就是Exppattern，它用来辅助确定询问的卡牌必须满足哪些需求。

由于用作参数的pattern基本都是string类型，所以这里主要围绕如何编写这种字符串来说。

pattern的语法
-------------

一个完整的pattern是用多个 ``matcher`` 组成的，并用分号 ``;`` 相连接。

而每个单独的matcher的语法，则类似这样：

.. code::

   牌名|点数|花色|区域|完整牌名|牌类型|牌id

一个个来看看：

- 牌名：能匹配的牌名，准确来说匹配的是 ``trueName`` 。比如slash也能匹配火杀。但反过来就不行了。
- 点数：匹配的牌的点数。可以用波浪线表示范围：2~6等。
- 花色：匹配的牌的花色，可以写heart, spade, club, diamond
- 区域：匹配的牌的区域，匹配hand（手牌区）, equip（装备区），以及各种私人牌堆。
- 完整牌名：类似牌名，但匹配的是 ``name`` 。
- 牌类型：匹配牌的类型，可以写 basic, trick, equip 亦可写牌的副类别，如 weapon
- 牌id：匹配牌的id

在这每一项中，你可以用逗号 ``,`` 来分隔相应的项，让他能匹配多种情况。比如 ``slash,jink`` 就能同时匹配杀和闪。

你也可以使用 ``^`` 来否定某一个元素，这样会匹配除了他之外的卡牌。比如 ``.|.|.|.|.|.|^65`` 匹配所有id不为65的牌。

若想同时否定多个元素，则需要用括号，例如 ``^(3,5)`` 。 ``^3,^5`` 会被认为是匹配所有不是3或者所有不是5，这样一来就变成匹配所有了。

说到匹配所有，使用点号 ``.`` 即可让这一项匹配所有。默认情况下每一项都是匹配所有情况。

对pattern进行测试
-----------------

答案是使用dbg大法让游戏停下！然后可以用如下的代码测试一个pattern:

.. code:: lua

   Exppattern:Parse(".|2~8"):match(card)

至于card自己想办法获取吧，比如getCardById啥的。
