en.javascript.info/10-regular-expressions-javascript/9-regexp-alternation/1-find-programming-language/solution.md
2015-04-07 15:22:06 +03:00

1.4 KiB
Raw Blame History

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

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

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

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

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

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

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

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

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

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

В действии:

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

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

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