Technipion
Erfahrenes Mitglied
Dieser Post bezieht sich hierauf: Textmuster miteinander vergleichen
Erzeugt bei mir die Ausgabe:
Zwei Punkte dazu:

Gruß Technipion
Ich habe mal eine Beispielimplementierung in Python geschrieben. Hier der Code:Das interessiert mich doch jetzt.
Javascript, php oder in c, oder in was könntest du?
Python:
# tutorials.de
# Textmuster miteinander vergleichen
import functools
def main():
patterns = ["DS05-03",
"DS05-04",
"DS05-**",
"DS**-04",
"DS**-**",
"DS0504",
"DS05**",
"BS05-04"]
base_text = "DS05-04"
print("*** base text:", base_text, "***")
for pattern in patterns:
print(pattern, "Match" if is_match(pattern, base_text) else "No match", sep=" -> ")
def is_match(pattern, base_text):
if len(pattern) != len(base_text):
return False
tokens = tokenize(pattern)
return all(base_text[token[0]:token[1]] == pattern[token[0]:token[1]]
for token in tokens)
@functools.cache
def tokenize(pattern):
if len(pattern) == 0:
return []
tokens = []
on_token = bool(pattern[0] != '*') # are we currently parsing a token?
last_index = 0 # index of beginning of current token
for i, ch in enumerate(pattern):
if ch == '*':
if on_token: # token has finished
tokens.append((last_index, i))
on_token = False
else: # consecutive asterisks
continue
else:
if on_token: # still on token
continue
else: # new token begins
last_index = i
on_token = True
# if necessary: add pending token
if on_token:
tokens.append((last_index, len(pattern)))
return tokens
if __name__ == '__main__':
main()
Erzeugt bei mir die Ausgabe:
Code:
$ python solve.py
*** base text: DS05-04 ***
DS05-03 -> No match
DS05-04 -> Match
DS05-** -> Match
DS**-04 -> Match
DS**-** -> Match
DS0504 -> No match
DS05** -> No match
BS05-04 -> No match
Zwei Punkte dazu:
- Ich verwende hier Memoisation, da ein Pattern immer zu genau den gleichen Token umgewandelt wird. So spare ich mir einfach die manuelle Pufferung.
- Der wichtige Teil ist hier
base_text[token[0]:token[1]] == pattern[token[0]:token[1]]
. Sieht zwar nicht so aus, ist aber ein String-Comparison und lässt sich prinzipiell zu effizientem Assembly (REPE + CMPS) herunterkompilieren.

Gruß Technipion