Javascript не будет разделяться с использованием регулярного выражения
С тех пор, как я начал писать этот вопрос, я думаю, что я выяснил ответы на каждый вопрос, который у меня был, но я думал, что все равно опубликую, поскольку он может быть полезен другим, и может быть полезно разъяснение.
Я пытался использовать регулярное выражение с lookahead с помощью функции javascript. По какой-то причине он не разбивал строку, даже если находит совпадение, когда я вызываю совпадение. Первоначально я думал, что проблема связана с использованием lookahead в моем регулярном выражении. Вот упрощенный пример:
Не работает:
"aaaaBaaaa".split("(?=B).");
Работает:
"aaaaBaaaa".match("(?=B).");
Похоже, проблема заключалась в том, что в примере разделения переданная строка не интерпретировалась как регулярное выражение. Использование косой черты вместо кавычек, похоже, устраняет проблему.
"aaaaBaaaa".split(/(?=B)./);
Я подтвердил свою теорию следующим глупым примером:
"aaaaaaaa(?=B).aaaaaaa".split("(?=B).");
Кто-нибудь еще считает странным, что функция соответствия предполагает, что у вас есть регулярное выражение, в то время как функция split не работает?
Ответы
Ответ 1
String.split
принимает в качестве первого параметра строку или регулярное выражение. Метод String.match
принимает только регулярное выражение.
Я бы предположил, что String.match
будет пытаться работать со всем, что было передано; поэтому, если вы передадите строку, она будет интерпретировать ее как регулярное выражение. Метод String.split
не имеет такой возможности, потому что он может принимать регулярные выражения и строки; в этом случае глупо вторгаться.
Изменить: (От: "JavaScript: окончательное руководство" )
String.match
требуется регулярное выражение для работы. Прошедшим аргументом должен быть объект RegExp
, который указывает шаблон, который нужно сопоставить. Если этот аргумент не является RegExp
, он сначала преобразуется в один, передавая его конструктору RegExp()
.
Ответ 2
Если я правильно помню (и я мог быть очень неправ здесь), метод split был реализован в javascript до того, как механизм регулярных выражений был широко использован, поэтому он предположительно для обратной совместимости.