Jump to content

Array problems


Recommended Posts

So I've got a pattern and a test case, and I'd like to build a function that tests the pattern, and returns the wildcard elements as an array if there is a match.

Here's what I want to do:

;Break input into words array

;break pattern into words array

;locate and index stars in pattern

;make an array of word groups in the pattern

;Make an array of word groups in the input

;Compare the two

;Success! if all the word groups are equal

;Failure if they aren't.

I want to get rid of the *s in the $patternGroups and $inputGroups

CODE

#include <GUIEdit.au3>

;Break input into words array

$inputString = "a Dog is a Mammal is a Animal is a bob is a Thing and another Thing and so on, and so forth. Woot."

$inputTest = StringRegExp($inputString, "[\w]+", 3)

;break pattern into words array

$patternString = "a * is a * is a * is a bob is a * and another * and so on, and so forth. *."

$pattern = StringRegExp($patternString , "[*\w]+", 3)

;locate and index stars in pattern

Dim $starIndex[uBound($pattern)]

$y = 0

$z = 0

While $z < UBound($pattern)

If $pattern[$z] = "*" Then

ReDim $starIndex[$y+1]

$starIndex[$y] = $z

$y+=1

EndIf

$z+=1

WEnd

;make an array of word groups in the pattern

Dim $patternGroups[uBound($starIndex)+1]

$y = 0

$z = 0

$x = 0

While $z < UBound($starIndex)

$x = $starIndex[$z]

While $y < $x

$patternGroups[$z] = $patternGroups[$z] & " " & $pattern[$y]

$y+=1

WEnd

$z+=1

WEnd

;Make an array of word groups in the input

Dim $inputGroups[uBound($starIndex)+1]

$y = 0

$z = 0

$x = 0

While $z < UBound($starIndex)

$x = $starIndex[$z]

While $y < $x

$inputGroups[$z] = $inputGroups[$z] & " " & $inputTest[$y]

$y+=1

WEnd

$z+=1

WEnd

;Compare the two

_ArrayDisplay($patternGroups)

_ArrayDisplay($inputGroups)

;Success! if all the word groups are equal

;Failure if they aren't.

I've almost got the function working, but I can't figure out how to drop the first word of each group, and I can't retrieve the last word groups for either of the input or pattern arrays.

Link to comment
Share on other sites

I'm not really sure what you're after. I came up with this:

#include <GUIEdit.au3>
#include <Array.au3>

;Break input into words array
$inputString = "a Dog is a Mammal is a Animal is a bob is a Thing and another Thing and so on, and so forth. Woot."
$inputTest = StringRegExp($inputString, "[\w]+", 3)

;break pattern into words array
$patternString = "a * is a * is a * is a bob is a * and another * and so on, and so forth. *."
$pattern = StringRegExp($patternString , "[*\w]+", 3)

;Dump input to console
ConsoleWrite("Input" & @CRLF)
For $X = 0 to Ubound($inputTest)-1
    ConsoleWrite("["&$X&"]: " & $inputTest[$X] & @CRLF)
Next
ConsoleWrite(@CRLF)

;Dump pattern to console
ConsoleWrite("Pattern" & @CRLF)
For $X = 0 to Ubound($pattern)-1
    ConsoleWrite("["&$X&"]: " & $pattern[$X] & @CRLF)
Next
ConsoleWrite(@CRLF)

;Dump matches to console
ConsoleWrite("Matches" & @CRLF)
For $X = 0 to Ubound($pattern)-1
    If $pattern[$X] = "*" Then
        ConsoleWrite("["&$X&"]: " & $inputTest[$X] & @CRLF)
    EndIf
Next

Output:

Input
[0]: a
[1]: Dog
[2]: is
[3]: a
[4]: Mammal
[5]: is
[6]: a
[7]: Animal
[8]: is
[9]: a
[10]: bob
[11]: is
[12]: a
[13]: Thing
[14]: and
[15]: another
[16]: Thing
[17]: and
[18]: so
[19]: on
[20]: and
[21]: so
[22]: forth
[23]: Woot

Pattern
[0]: a
[1]: *
[2]: is
[3]: a
[4]: *
[5]: is
[6]: a
[7]: *
[8]: is
[9]: a
[10]: bob
[11]: is
[12]: a
[13]: *
[14]: and
[15]: another
[16]: *
[17]: and
[18]: so
[19]: on
[20]: and
[21]: so
[22]: forth
[23]: *

Matches
[1]: Dog
[4]: Mammal
[7]: Animal
[13]: Thing
[16]: Thing
[23]: Woot
Link to comment
Share on other sites

I'm after getting wildcards to work with the AIML parser script. almost there :)

Testing on other random cases, and I'll have to make it into a single function, and throw in the comparison of non wildcard elements.

Thanks!

If they're different, then the pattern isn't valid, and the result would be a mismatched response. I only want to return a set of matches if the non-wildcard words are identical.

Edited by Jrowe
Link to comment
Share on other sites

Even simpler:

;Break input into words array
$inputString = "a Dog is a Mammal is a Animal is a bob is a Thing and another Thing and so on, and so forth. Woot."

$patternString = "a * is a * is a * is a bob is a * and another * and so on, and so forth. *."

$format_pattern = StringReplace($patternString, ".", "\.")
$format_pattern = StringReplace($format_pattern, "*", "(.*?)")

$simple = StringRegExp($inputString, $format_pattern, 3)
For $X = 0 to Ubound($simple)-1
    ConsoleWrite("["&$X&"]: " & $simple[$X] & @CRLF)
Next
Link to comment
Share on other sites

Oh, wow. That's awesome... now it can even accept multiple word wildcards.

;Break input into words array
$inputString = "Generic AIML Test going on Here"

$patternString = "Generic * Test * Here"

$format_pattern = StringReplace($patternString, ".", "\.")
$format_pattern = StringReplace($format_pattern, "*", "(.*?)")

$simple = StringRegExp($inputString, $format_pattern, 3)
For $X = 0 to Ubound($simple)-1
    ConsoleWrite("["&$X&"]: " & $simple[$X] & @CRLF)
Next
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...