mIRC/mSL 从通配符中提取 certian 字符串

mIRC/mSL pulling certian strings out of a wildcard

所以我对 mSl 脚本编写还很陌生,但我之前编写过一些其他脚本。我试图弄清楚如何进行一些模式匹配,但我遇到了问题。假设我有以下文字

Someone has flipped a coin to Jim and it was head.

我想知道硬币最后是正面还是反面。我以为它会像

on *:text:*flipped a coin * and it was *:#:{echo -a the coin was }

但似乎 $ 运算符正在从完整的通配符中取出第 3 个单词。我也许可以弄清楚如何通过这个例子来解决问题,但假设我们有以下多个硬币的例子

Someone flipped a coin to Dave and it was tails, and also filled a coin to Jim and it was heads.

我想知道吉姆有什么硬币,但我不知道在他之前或之后有多少人,所以在我的通配符中找到第 x 个单词是行不通的。我想做的是这样的(主要是 sudo 代码)

on *:text: * to Jim and it was :#:{ 
    echo -a  is who flipped it to Jim and it was 
}

在这里我基本上可以扔掉我的通配符,现在我可以直接参考抛硬币的人是谁,结果是什么。

感谢您的帮助!

编辑:

我可以使用正则表达式找到找到硬币的结果,但我不确定如何在 mirc 中提取结果。请参阅我正在使用的正则表达式模式 here 。我尝试在 mirc 和 $regml 中使用 $regex,但它无法正常工作。我目前的脚本中有以下内容:

on $*:text:/Jim and it was (\b\w{5}\b)/iS:#:{
echo -a $regex(currCoin, -,Jim and it was (\b\w{5}\b))
echo -a $regml(currCoin,0)
echo -a $regml(currCoin,1)
}

我认为 $regex 基本上会将我的正则表达式中的组保存到 currCoin,然后 $regml 会显示第 N 个组的值,有点像 $N 会在正则表达式中显示第 N 个组的值。不过,我显然想念一些东西。

您可以为此使用令牌标识符而不是正则表达式。我至少有 10 年没有使用 msl,所以请耐心等待。

on *:text:*to Jim and it was*:#:{
  var %jimpos = $findtok(-,Jim,1,32)
  var %coinpos = %jimpos + 4
  var %result = $gettok(-,%coinpos,32)
  msg $chan $remove(%result,.)
}

你可以稍微缩短它或者在同一行上做更多的操作,但这至少是可读的。

on *:action:$(*has flipped a coin to  and it was  $+ *):#: {
  var %coin.1,%coin.2, %user.1, %user.2
  %user.1 = 
  if (head isin ) { %coin.1 = heads }
  if (tail isin  { %coin.1 = tails }
  if (*and also filled a coin to ?* and it was ?????. iswm -) {
    %user.2 = 
    if (head* iswm ) { %coin.2 = heads }
    else { %coin.2 = tails }
   }
   echo $nick says he/she flipped a coin to %user.1 $iif(%user.2,and %user.2)
}

只需确保在每个句子中始终使用相同数量的单词。因此,如果您说“HAS flipped a coin...”,您需要始终用“has flipped ...”来表达它

您可能会注意到我使用了 :action::#: 而不是 :text::#: 这是检测 /描述#chan 文本。也称为 /me 或 /action。