wyrażenie regularne nie jest anchored co oznacza, że [^;]*
będzie nadal pasuje na wszystkich znaków w górę do możliwego ;
(a więc dopasować jako całość). Jeśli zakotwiczyć regex przed końcem linii ([^;]*$
) będzie produkować wyniki szukasz:
$ cat t.sh
#!/bin/bash
pattern='class [^;]*$'
while read -r line; do
printf "testing '${line}': "
[[ $line =~ $pattern ]] && echo matches || echo "doesn't match"
done <<EOT
class test
class test;
class test; // test class
EOT
$ ./t.sh
testing 'class test': matches
testing 'class test;': doesn't match
testing 'class test; // test class': doesn't match
TL; DR: Innymi słowy, pogrubione części w
test lekcyjny; foo bar quux
dopasowuje twoje wyrażenie regularne, mimo że ciąg zawiera średnik, dlatego zawsze pasuje. Zakotwiczenie zapewnia, że wyrażenie regularne pasuje tylko wtedy, gdy nie ma średnika aż do samego końca ciągu znaków.
Co z 'testem klasy // klasa testowa;'? –
Nie edytuj tego pytania, podając nowe pytanie lub usuń informacje z tego pytania, które zawiera odpowiedzi. Użyj przycisku [Zadaj pytanie] (http://stackoverflow.com/questions/ask) i opublikuj nowe pytanie z [wszystkimi szczegółami potrzebnymi do uzyskania odpowiedzi] (http://stackoverflow.com/help/how- to-ask) – Taryn