en.javascript.info/10-regular-expressions-javascript/10-regexp-alternation/1-find-programming-language/solution.md
Ilya Kantor e2443e8de6 ok
2017-03-19 16:59:53 +03:00

1.3 KiB
Raw Blame History

Сначала неправильный способ.

Если перечислить языки один за другим через |, то получится совсем не то:

var reg = /Java|JavaScript|PHP|C|C\+\+/g;

var str = "Java, JavaScript, PHP, C, C++";

alert( str.match(reg) ); // Java,Java,PHP,C,C

Как видно, движок регулярных выражений ищет альтернации в порядке их перечисления. То есть, он сначала смотрит, есть ли match:Java, а если нет -- ищет match:JavaScript.

Естественно, при этом match:JavaScript не будет найдено никогда.

То же самое -- с языками match:C и match:C++.

Есть два решения проблемы:

  1. Поменять порядок, чтобы более длинное совпадение проверялось первым: pattern:JavaScript|Java|C\+\+|C|PHP.
  2. Соединить длинный вариант с коротким: pattern:Java(Script)?|C(\+\+)?|PHP.

В действии:

var reg = /Java(Script)?|C(\+\+)?|PHP/g;

var str = "Java, JavaScript, PHP, C, C++";

alert( str.match(reg) ); // Java,JavaScript,PHP,C,C++