Я занимаюсь разбором строк и хотел бы использовать регулярные выражения. Я перебираю строки и хотел бы применить что-то вроде «startWith», используя регулярное выражение и смещение, возвращая совпадение, если оно найдено, или ноль, если нет. В псевдо-JavaScript:
function startsWith(string, regex, offset) {
if (regex_matches_at_offset) {
return match;
} else {
return null;
}
}
Простое и понятное решение - сначала применить подстроку, а затем сопоставить. Но я хочу что-то вроде «opensWith» с использованием регулярных выражений.
Если бы это была строка вместо регулярного выражения, я бы выбрал начинается с
function startsWith(string, other_string, offset) {
let starts_with=s.startsWith(other_string, offset); // startsWith from position offset onwards, as other_string has fixed length the "match" is also known
if (starts_with) {
return other_string; // other_string = match
} else {
return null;
}
}
Но для регулярных выражений мое текущее решение (только для целей тестирования) выглядит следующим образом:
function startsWith(string, regex, offset) {
let end_part=s.substring(offset); // Substring, performance issue
let match=end_part.match(regex); // Match it as we need the match
if (match.length === 0) {
return null;
} else {
match=match[0]; // Only care about 1st match
}
if (end_part.startsWith(match)) { // Check if match already starts at first position
return match;
} else {
return null;
}
}
Что не очень хорошо, так как есть очевидные проблемы (копирование большей части строки, выполнение поиска по регулярному выражению дважды ...
Ожидаемый:
- Найти регулярное выражение в строке, начиная с заданной позиции, не только логическое, но и совпадение
- Высокая производительность (не копируйте всю строку, например)
Примеры:
startsWith("Hello world !", /h/i, 0); // "H"
startsWith("Hello world !", /wor?/i, 6); // "wor"
startsWith("Hello world !", /wor?/i, 10); // null
startsWith("Hello world !", /z/i, 0); // null