Register forum user name Search FAQ

Gammon Forum

Notice: Any messages purporting to come from this site telling you that your password has expired, or that you need to "verify" your details, making threats, or asking for money, are spam. We do not email users with any such messages. If you have lost your password you can obtain a new one by using the password reset link.
 Entire forum ➜ MUSHclient ➜ General ➜ Matching mid line for trigger

Matching mid line for trigger

It is now over 60 days since the last post. This thread is closed.     Refresh page


Pages: 1 2  

Posted by Xavious   (41 posts)  Bio
Date Sat 14 Jun 2008 12:29 AM (UTC)

Amended on Sat 14 Jun 2008 02:26 AM (UTC) by Nick Gammon

Message
I have constructed a plugin to automatically research skills on a swr mud that I play, however I opted to make it more effecient. Originally I created an array of 150 and put a skill into each one and created a system that loops through researching skills until they are done. Now I am trying to make the process more automated for whenever new skills are involved. The skill list looks like this:

---------------------------------Skills-----------------------------------
advanced electronics  15%                  aid  80%                  aim  95%  
               bash  99%                  beg  20%              berserk  92%  
          blastdoor  90%                 call  90%            chemistry  15%  
        claimbounty  20%         construction  15%                 data  15%  
        destruction  15%                  dig   0%               disarm  90%  
               dock  90%                dodge 100%             doorbash   0%  
         dual wield 100%            duplicate  80%              edibles  15%  
          education  15%          electronics  90%     emergency_refuel  90%  
       enhancearmor  90%      enhanced damage 100%          enhancement  15%  
          equipment  15%            first aid  90%               flurry  15%  
          forensics  15%               gather  45%                gouge  97%  
           grenades  80%                 grip  90%             guidance  15%  
             hitall 100%                 jail  90%                 kick 100%  
           machines  15%            makeblade  90%          makecanteen  90%  
        makecircuit  90%          makecomlink  90%        makecontainer 100%  
        makedatapad  90%       makeflashlight  90%          makegoggles  90%  
        makeholster  90%          makejewelry  90%              medical  15%  
           minerals  15%                mines  90%                mount  90%  
          narcotics  15%           navigation 100%               ponder 100%  
        repairarmor  91%         repairweapon  90%               rescue 100%  
           research 100%                 scan 100%               search   0%  
      second attack 100%     ship maintenance  90%         ship systems 100%  
         showplanet 100%     small spacecraft 100%                snipe 100%  
         spacecraft  15%                study  88%               survey   0%  
              teach  15%                throw  90%              torture  90%  
     transportation  71%             tuneship  90%       weapon systems  94%  
---------------------------------Weapons-----------------------------------
   advanced blaster 100%   advanced bowcaster  90%   advanced forcepike  90%  
advanced vibroblade  97%      blaster mastery  91%             blasters 100%  
  bowcaster mastery  90%           bowcasters  90%           disruptors  90%  
        force pikes  90%    forcepike mastery  90%       unarmed combat  90%  
       vibro-blades 100%  
To see a shorter practice list, type PRACTICE <class name>.


What I want to do is have each skill automatically put into the array for processing by a trigger, however I can't seem to get the text from each skill to match midline. I've tried * and .* and browsed through the forums for similiar problems, but I can't seem to find a solution.
Example:

bash  99%         (doesn't trigger anything)
.* bash  99%      (doesn't trigger anything)
/sbash  99%       (doesn't trigger anything)
               bash  99%                  beg  20%              berserk  92% 
(triggers just fine)

Top

Posted by Xavious   (41 posts)  Bio
Date Reply #1 on Sat 14 Jun 2008 12:32 AM (UTC)
Message
I'm a newb to this forum and it seems my whitespace has been taken out for consolidation. The essence of my problem I think though is matching text midline regardless of the contents in the rest of the line. All those skills should have white space between them.. even the ones on the far left colum start out with whitespace first then the skill.
Top

Posted by Nick Gammon   Australia  (23,068 posts)  Bio   Forum Administrator
Date Reply #2 on Sat 14 Jun 2008 02:27 AM (UTC)
Message
To preserve spacing use the [code] ... [/code] tags - I have amended your post to do that.

- Nick Gammon

www.gammon.com.au, www.mushclient.com
Top

Posted by Nick Gammon   Australia  (23,068 posts)  Bio   Forum Administrator
Date Reply #3 on Sat 14 Jun 2008 02:45 AM (UTC)

Amended on Sat 14 Jun 2008 02:47 AM (UTC) by Nick Gammon

Message
What you need to do is simply take what you have explained, and put that into a regular expression.

My result is this:


<triggers>
  <trigger
   custom_colour="2"
   enabled="y"


match="^\s*([-a-z ]+)\s+(\d+)%\s*(?:([-a-z ]+)\s+(\d+)%\s*){0,1}(?:([-a-z ]+)\s+(\d+)%\s*){0,1}$"


   regexp="y"
   send_to="2"
   sequence="100"
  >
  <send>%%1 = %1
%%2 = %2
%%3 = %3
%%4 = %4
%%5 = %5
%%6 = %6

</send>
  </trigger>
</triggers>


See http://mushclient.com/pasting for how to copy that into the client
Run against your test data I got:


advanced electronics  15%                  aid  80%                  aim  95%  
%1 = advanced electronics 
%2 = 15
%3 = aid 
%4 = 80
%5 = aim 
%6 = 95

               bash  99%                  beg  20%              berserk  92%  
%1 = bash 
%2 = 99
%3 = beg 
%4 = 20
%5 = berserk 
%6 = 92

... and so on ...

  bowcaster mastery  90%           bowcasters  90%           disruptors  90%  
%1 = bowcaster mastery 
%2 = 90
%3 = bowcasters 
%4 = 90
%5 = disruptors 
%6 = 90

        force pikes  90%    forcepike mastery  90%       unarmed combat  90%  
%1 = force pikes 
%2 = 90
%3 = forcepike mastery 
%4 = 90
%5 = unarmed combat 
%6 = 90

       vibro-blades 100%  
%1 = vibro-blades
%2 = 100
%3 = 
%4 = 
%5 = 
%6 = 


Basically what is happening in the regexp is for each skill:


\s*([-a-z ]+)\s+(\d+)%\s*


Which is:


  • \s* --> match zero or more spaces
  • ( --> start of capture group
  • [-a-z ]+ --> match a-z, space or hyphen, 1 or more times
  • ) --> end of capture group
  • \s+ --> match one or more spaces
  • ( --> start of capture group
  • \d+ --> match one or more digits
  • ) --> end of capture group
  • % --> match the % symbol
  • \s* --> match zero or more spaces


Then I copied and pasted that for the next two instances on the same line.

However as in your last line, you don't necessarily have 3 skills, I made the entire group optional, by putting the above into:


(?: .... group here .... ){0,1}


The ?: means make a non-capture group (so it doesn't become a wildcard). The {0,1} means zero or one of them (ie. it is optional). Ditto for the third group.

Then I wrapped it up between ^ .... $ which means <start of line> <something> <end of line>.

- Nick Gammon

www.gammon.com.au, www.mushclient.com
Top

Posted by Worstje   Netherlands  (899 posts)  Bio
Date Reply #4 on Sat 14 Jun 2008 11:18 AM (UTC)
Message
Nice job explaining that trigger, Nick.

Also, whereas the {0,1} is very verbose and might make it easier to understand, it can also be considered to clutter up the regexp and make it harder to see what it does. As such, you can consider the ? operator to be equivalent.

(...)? is the same as (...){0,1}

I usually prefer the shorthand ? variety, although it could be misconstrued since it is also a laziness specifier when added AFTER the repetition operator. Like: a{2,5}? or b*?

But well... that's just a bit more information because I'm bored and suffering from a headache. ^_^
Top

Posted by Xavious   (41 posts)  Bio
Date Reply #5 on Sat 14 Jun 2008 02:43 PM (UTC)
Message
Thanks Nick for the quick response. I am a very big fan of MUSHclient and it's functionality and applaud you for all your work. You seem to really know what your talking about. I am an aspiring programmer as well, but I am still in my early stages of development. I think my issue with what I am trying to accomplish is that I am a novice with regular expressions. I read a help file about it included in the software, but it was a bit over my head. I will continue to research this topic, though, because I have an interest in constructing some pretty ellaborate plugins. I LOVE THAT FEATURE BTW! Plugins are amazing.. and they are conveniently packaged in XML format.
Top

Posted by Nick Gammon   Australia  (23,068 posts)  Bio   Forum Administrator
Date Reply #6 on Sat 14 Jun 2008 09:35 PM (UTC)

Amended on Sat 14 Jun 2008 09:50 PM (UTC) by Nick Gammon

Message
Thanks for your complimentary remarks, both of you. :-)

Out of interest, the regexp can be expressed a bit more readably by using the "extended syntax" option, which lets you put spaces in the middle. When you do this, to match on spaces themselves they either have to be represented as \s (whitespace) or in brackets, eg. [ ].

Here is the extended version:


match="(?x)^ \s{0,} ( [-a-z ]{1,} ) \s{1,} ( \d{1,} ) % \s{0,} (?: ( [-a-z ]{1,} ) \s+ ( \d{1,} ) % \s{0,} ){0,1} (?: ( [-a-z ]{1,} ) \s{1,} ( \d{1,} ) % \s{0,} ){0,1} $"


In the above version, for consistency, I used the {x,y} syntax, that Worstje dislikes, everywhere. It makes it wordier, I agree, but make it clearer that certain things happen a certain number of times.

To be consistent also, the version below removes that syntax and uses ? for the {0,1} case:


match="(?x)^ \s* ( [-a-z ]+ ) \s+ ( \d+ ) % \s* (?: ( [-a-z ]+ ) \s+ ( \d+ ) % \s* )? (?: ( [-a-z ]+ ) \s+ ( \d+ ) % \s* )? $"


- Nick Gammon

www.gammon.com.au, www.mushclient.com
Top

Posted by Worstje   Netherlands  (899 posts)  Bio
Date Reply #7 on Sat 14 Jun 2008 09:48 PM (UTC)
Message
I don't dislike brackets per se, it's merely a choice and opinion. Same with where people put their brackets (line of declaration, following line, gnu-inbetween, etc).

Likewise, I'm personally no fan of lax spacing and only doing so through \s. There's two reasons for that. First is that, while \s has its advantages, it also has a rather simple 'matches whitespace' definition.. and usually when I'm using regular expressions, it is to match automated output, which means I tend to know the precise byte and such used. When I end up matching unicode and such, depending on the regex and such, it could suddenly start matching things I don't want it to. Then again, I use regular expressions for nearly everything these days, and not everybody does so. So in that sense, \s can't hurt 99.9% of the time.

Second, more realistic motivation I guess. I'm not too fond of compile time regular expression settings. As a user, I don't care what engine I use or what settings it is compiled with. I just want my regular expressions to work, and not worry about extended syntax, ignoring case and all those other options. Pretty much all of them can be accessed from within a regular expression itself using the options in a captured group, anyhow. But I digress.

I really need to go to bed some time. It beats writing these random essays on my personal choice, which don't matter since everyone has their own preferences anyhow. ^_^
Top

Posted by Xavious   (41 posts)  Bio
Date Reply #8 on Tue 17 Jun 2008 12:54 AM (UTC)
Message
It seems I will have to spend some time researching regular expressions. I have read the tutorial and I only have a basic understanding at this point. I could not get your trigger match to match when I use the skill list. I tried sending a note to script and even sending a random command to the mud, but there is no indication that this match is triggering.
Top

Posted by Nick Gammon   Australia  (23,068 posts)  Bio   Forum Administrator
Date Reply #9 on Tue 17 Jun 2008 03:03 AM (UTC)
Message
I copied and pasted your test data from above to test the regexp, so it should have fired.

- Nick Gammon

www.gammon.com.au, www.mushclient.com
Top

Posted by Nick Gammon   Australia  (23,068 posts)  Bio   Forum Administrator
Date Reply #10 on Tue 17 Jun 2008 03:42 AM (UTC)
Message
If you still can't get it to work can you please copy and paste the exact trigger you are using (see http://mushclient.com/copying) as I suggested a couple of variations, and another sample of MUD output, which it is not firing on.

- Nick Gammon

www.gammon.com.au, www.mushclient.com
Top

Posted by Xavious   (41 posts)  Bio
Date Reply #11 on Tue 17 Jun 2008 08:22 PM (UTC)
Message
LOL wow.. I made a foolish error. Alright.. I just now copied your XML instead of just the trigger match and used the "paste" feature to generate the trigger and it worked perfectly. Then I realized why mine wasn't working... I forgot to check the regular expression box!
Top

Posted by Xavious   (41 posts)  Bio
Date Reply #12 on Sat 28 Jun 2008 02:47 PM (UTC)
Message

Some of the lines did not fire using your test trigger and I am not certain why. Here is an example.
---------------------------------Skills-----------------------------------
advanced electronics  15%                  aid  82%                  aim 100%  
%1 = advanced electronics 
%2 = 15
%3 = aid 
%4 = 82
%5 = aim
%6 = 100

             ambush   0%             backstab   0%                 bash  99%  
%1 = ambush  
%2 = 0
%3 = backstab  
%4 = 0
%5 = bash 
%6 = 99

                beg  20%              berserk  92%            blastdoor  90%  
%1 = beg 
%2 = 20
%3 = berserk 
%4 = 92
%5 = blastdoor 
%6 = 90

               call  90%            chemistry  15%          claimbounty  20%  
%1 = call 
%2 = 90
%3 = chemistry 
%4 = 15
%5 = claimbounty 
%6 = 20

            conceal   0%         construction  15%                 data  15%  
%1 = conceal  
%2 = 0
%3 = construction 
%4 = 15
%5 = data 
%6 = 15

        destruction  15%             diagnose  91%                  dig  20%  
%1 = destruction 
%2 = 15
%3 = diagnose 
%4 = 91
%5 = dig 
%6 = 20

             disarm  96%                 dock  90%               doctor  90%  
%1 = disarm 
%2 = 96
%3 = dock 
%4 = 90
%5 = doctor 
%6 = 90

              dodge 100%             doorbash   0%              doorcut  90%  
%1 = dodge
%2 = 100
%3 = doorbash  
%4 = 0
%5 = doorcut 
%6 = 90

         dual wield 100%            duplicate  80%              edibles  15%  
%1 = dual wield
%2 = 100
%3 = duplicate 
%4 = 80
%5 = edibles 
%6 = 15

          education  15%          electronics  90%     emergency_refuel  90%  
       enhancearmor  90%      enhanced damage 100%          enhancement  15%  
%1 = enhancearmor 
%2 = 90
%3 = enhanced damage
%4 = 100
%5 = enhancement 
%6 = 15

Top

Posted by Poromenos   Greece  (1,037 posts)  Bio
Date Reply #13 on Sat 28 Jun 2008 05:12 PM (UTC)
Message
By the way, a more terse regex would be:

^ *(.*?) (\d+)% *(.*?) (\d+)% *(.*?) (\d+)% *$

Vidi, Vici, Veni.
http://porocrom.poromenos.org/ Read it!
Top

Posted by Darwin   USA  (125 posts)  Bio
Date Reply #14 on Sat 28 Jun 2008 06:30 PM (UTC)
Message
The match failed because emergency_refuel contains an underscore which was not included in the set to match. Just change the sets from [-a-z ] to [-a-z_ ] and it should match cases like those.
Top

The dates and times for posts above are shown in Universal Co-ordinated Time (UTC).

To show them in your local time you can join the forum, and then set the 'time correction' field in your profile to the number of hours difference between your location and UTC time.


58,688 views.

This is page 1, subject is 2 pages long: 1 2  [Next page]

It is now over 60 days since the last post. This thread is closed.     Refresh page

Go to topic:           Search the forum


[Go to top] top

Information and images on this site are licensed under the Creative Commons Attribution 3.0 Australia License unless stated otherwise.