Tracks
/
JavaScript
JavaScript
/
Übungen
/
Regulärer Chatbot
Regulärer Chatbot

Regulärer Chatbot

Lernübung

Einführung

Reguläre Ausdrücke in JavaScript

Ein Regulärer Ausdruck (oder Regex) ist eine Folge von Zeichen, mit der wir bestimmte Elemente in Strings ansprechen und bearbeiten können. Damit können wir:

  • nach einem Text in einem String suchen
  • Teilstrings in einem String ersetzen
  • Informationen aus einem String extrahieren

💡 JavaScripts Regex-Variante ist Teil des ECMA-262-Standards für die Sprache. Das bedeutet, dass du dir keine Gedanken über browserspezifische Kompatibilität machen musst.

Wie du reguläre Ausdrücke erstellst

In JavaScript schreibt man einen regulären Ausdruck meist im Format /pattern/modifiers.

Es gibt zwei Möglichkeiten, einen regulären Ausdruck zu erstellen:

  1. Literal für reguläre Ausdrücke:
const regex = /[a-z]/;
  1. Konstruktor RegExp:
const regex = new RegExp('[a-z]');

In beiden Fällen erstellt JavaScript aus dem Regex ein Objekt. Am besten verwendest du unveränderliche Muster und nutzt standardmäßig das Literal.

Den RegExp-Konstruktor kannst du für Fälle verwenden, in denen sich der reguläre Ausdruck ändert oder du ihn noch nicht kennst (etwa bei einer Eingabe).

🏴‍☠️ Flags

Reguläre Ausdrücke haben optionale Superkräfte namens flags, die zusätzliche Funktionen ermöglichen.

Einige der am häufigsten verwendeten sind:

  • /g - Globale Suche
  • /i - Groß-/Kleinschreibung ignorieren
  • /m - Mehrzeilige Suche

Hier ein einfaches Beispiel:

const re = /home/gi;
const str = 'Home, sweet home.';
const myArray = str.match(re);
console.log(myArray);

=> // ["Home", "home"]

Das Zeichen g ermöglicht es uns, alle möglichen Treffer in einem String zu finden. Ohne diese Funktion hätte JavaScript nur den ersten Treffer Home extrahiert.

Das Flag /i für Groß-/Kleinschreibung ignorieren macht uns beim Finden eines Musters flexibel. So spielt es keine Rolle, ob das Gesuchte in UPPERCASE oder lowercase geschrieben ist.

Wenn du den RegExp-Konstruktor verwendest, ist die Syntax zum Hinzufügen von Flags anders.

let regex = /[a-z]/gi; // literal notation
let regex = new RegExp('[a-z]', 'gi'); // constructor with string pattern as first argument
let regex = new RegExp(/[a-z]/, 'gi'); // constructor with regular expression literal as first argument (Starting with ECMAScript 6)

Die gängigsten Funktionen

Kombinierst du reguläre Ausdrücke mit den eingebauten Funktionen von JavaScript, hast du einige mächtige Möglichkeiten, Strings zu bearbeiten und Daten daraus zu gewinnen.

Das sind einige der häufigsten Funktionen, die zusammen mit Regex verwendet werden.

Test

Die Methode test() sucht nach einer Übereinstimmung zwischen einem regulären Ausdruck und einem angegebenen String. Sie gibt wahr oder falsch zurück.

const str = 'It is difficult to test if you have a virus';
const result = /virus$/.test(str);

console.log(result);

// => true

Match

Mit der Methode match() erhalten wir ein nützliches Array, dessen Inhalt davon abhängt, ob Treffer gefunden wurden oder nicht.

So können wir aus jedem String Informationen sowohl suchen als auch extrahieren. Zum Beispiel:

const funnyQuote =
  'If you see someone crying, ask if it is because of their haircut.';
const regex1 = /someone/;
const regex2 = /happy/;

funnyQuote.match(regex1);
// => ["someone", index: 11, input: "If you see someone crying, ask if it is because of their haircut.", groups: undefined]

funnyQuote.match(regex2);
// => null

Wenn das Flag /g für globale Suche gesetzt ist, gibt die Methode nicht nur den einen Treffer zusammen mit nützlichen Informationen wie dem Index oder der Eingabe zurück, sondern alle Vorkommen, die im Array angezeigt werden:

const funnyQuote =
  'If you see someone crying, ask if it is because of their haircut.';

const regex3 = /if/gi;

funnyQuote.match(regex3);
// => ["If", "if"];

Replace

Die Methode replace() in JavaScript ermöglicht es uns, in einem gegebenen String nach einem Wert zu suchen und ihn durch einen gewünschten neuen Wert zu ersetzen.

string.replace(searchValue, newValue);

Das Suchmuster für die Ersetzung kann ein einzelner String oder ein regulärer Ausdruck sein.

let string = 'I like dogs!';
let result = string.replace('dogs', 'cats');

let string = 'I would love to travel to Japan';
let result = string.replace(/Japan/g, 'Hawaii');

Außerdem können wir an der Stelle des Ersatzes eine Funktion anwenden, um jeden Wert zusätzlich zu verändern.

let text = 'Say hello to the chatbot.';
let result = text.replace(/chatbot|hello/gi, function (word) {
  return word.toUpperCase();
});
// => "Say HELLO to the CHATBOT"

Split

Die Methode split() in JavaScript ist eine andere Art, Strings mit regulären Ausdrücken zu verwenden und zu bearbeiten.

Auf diese Weise verwenden wir Regex, um einen gegebenen String anhand eines erkannten Musters zu teilen, z. B. str.split(/[,.\s]/). Dieses Muster wird als separator verwendet.

const str = 'hello,user.how are.you';

const result = str.split(/[,.\s]/);

console.log(result);
// => ['hello', 'user', 'how', 'are', 'you']

Anleitung

Du wurdest als Spezialist für reguläre Ausdrücke in einem Unternehmen eingestellt, das einen Chatbot entwickelt.

Er befindet sich in einer sehr frühen Entwicklungsphase, deshalb ist es deine Aufgabe, reguläre Ausdrücke zu verwenden, um die Fähigkeit des Chatbots zu verbessern, natürliche Sprache zu verstehen und zu erzeugen.

Gültigen Befehl prüfen

Neben seiner Intelligenz ist der Chatbot auch ein treuer Assistent.

Um dem Chatbot etwas zu fragen, muss der Nutzer das Wort „Chatbot“ an der ersten Position des Befehls sagen.

Es spielt keine Rolle, ob das Schlüsselwort in Groß- oder Kleinbuchstaben geschrieben ist. Wichtig ist hier die Position des Wortes.

Implementiere die Funktion isValidCommand(), die dem Chatbot hilft zu erkennen, wann der Nutzer einen Befehl gibt.

isValidCommand("Chatbot, play a song from the 80's.";
// => True
isValidCommand("Hey Chatbot, where is the closest pharmacy?";
// => False
isValidCommand("CHATBOT, do you have a solution for this challenge?";
// => True

Verschlüsselte Emojis entfernen

Der Chatbot hat Schwierigkeiten zu verstehen, wie Menschen Emojis benutzen, um ihre Gefühle auszudrücken.

Wenn der Chatbot Nachrichten von Nutzern erhält, wird jedes Emoji als „emoji“ gefolgt von seiner id-Nummer dargestellt.

Implementiere die Methode removeEmoji(), die einen String entgegennimmt und die gesamte Emoji-Verschlüsselung aus der Nachricht entfernt.

Zeilen, die keinen Emoji-Text enthalten, sollten unverändert zurückgegeben werden.

Entferne einfach den Emoji-String. Versuche nicht, die Leerzeichen anzupassen.

Verwende für diese Aufgabe die Konstruktor-Syntax, um den regulären Ausdruck zu erstellen.

removeEmoji("I love playing videogames emoji3465 it's one of my hobbies");
// => "I love playing videogames  it's one of my hobbies"

Gültige Telefonnummer prüfen

Da die Chatbot-Funktionen in einer mobilen App heruntergeladen werden, wird vom Nutzer erwartet, dass er während des Gesprächs eine Telefonnummer angibt.

Das Problem ist, dass der Chatbot nur eine Nummer mit einem bestimmten Format lesen und validieren kann.

Wenn die Nummer gültig ist (mit der Zeichenfolge übereinstimmt, die durch den regulären Ausdruck festgelegt ist), antwortet der Chatbot mit einer Nachricht, in der er dem Nutzer dankt und die Nummer bestätigt. Wenn die Nummer ungültig ist, informiert die Funktion den Nutzer darüber, dass die Telefonnummer nicht gültig ist.

Das erwartete Format ist: (+##) ###-###-###

checkPhoneNumber('(+34) 659-771-594');
// => "Thanks! You can now download me to your phone."
checkPhoneNumber('659-771-594');
// => "Oops, it seems like I can't reach out to 659-771-594"

Der Chatbot ist eine wirklich neugierige Software. Obwohl er im Internet zu einem bestimmten Thema suchen kann, fragt er Nutzer gerne nach coolen Websites oder URLs, um relevante Informationen zu finden.

Beispiel für ein Gespräch:

  • Chatbot: Hey username, ich würde gerne lernen, in JavaScript zu programmieren. Kennst du eine coole Website, auf der ich das lernen könnte?
  • Nutzer: Ich habe viel von exercism.org gelernt.

Implementiere die Funktion getURL(), die ein Array zurückgeben kann, das nur den Link jeder Website enthält. Einen regulären Ausdruck zu schreiben, der jede URL erkennt, wäre sehr kompliziert, aber der Chatbot muss nur einfache URLs lesen. Für diese Übung ist eine URL jede durch "." getrennte Folge von Wörtern.

getURL(
  'I learned a lot from exercism.org and developer.mozilla.org, but I found ts39.es very boring!',
);
// => ["exercism.org", "developer.mozilla.org", "ts39.es"];

Den Nutzer begrüßen

Um Daten von allen Personen zu speichern, mit denen eine Unterhaltung geführt wurde, kann der Chatbot den vollständigen Namen aus dem Profil des Nutzers in diesem Stil abrufen: „smith, john“.

Auf diese Weise möchten wir, dass unser Chatbot wirklich höflich ist und einen guten Eindruck macht.

Schreibe die Funktion niceToMeetYou(), die einen String mit dem vollständigen Namen des Nutzers entgegennimmt und den String „Nice to meet you, John Smith“ zurückgibt.

Implementiere die Funktion zu Lernzwecken mit einer Ersetzungsmethode für reguläre Ausdrücke.

let str = 'Smith, John';

niceToMeetYou(str);
// => "Nice to meet you, John Smith"
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
JavaScript Exercism

Bereit, mit Regulärer Chatbot zu starten?

Melde dich bei Exercism an, um JavaScript mit 37 Konzepte159 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.