JavaScript запускается с использованием регулярных выражений и смещения - PullRequest
0 голосов
/ 27 мая 2019

Я занимаюсь разбором строк и хотел бы использовать регулярные выражения. Я перебираю строки и хотел бы применить что-то вроде «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;
    }
}

Что не очень хорошо, так как есть очевидные проблемы (копирование большей части строки, выполнение поиска по регулярному выражению дважды ...

Ожидаемый:

  1. Найти регулярное выражение в строке, начиная с заданной позиции, не только логическое, но и совпадение
  2. Высокая производительность (не копируйте всю строку, например)

Примеры:

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

1 Ответ

4 голосов
/ 27 мая 2019

Одним из способов является построение регулярного выражения на основе смещения и шаблона, переданного в виде строки

  • Здесь начальная часть регулярного выражения использует . для соответствия любому символу до смещения
  • Второе использованиепереданный шаблон в захваченной группе для возврата только желаемого соответствия

let startsWith = (str, reg, offset) =>{
  let regex = `^.{${0,offset}}(${reg})`
  let final = new RegExp(regex,'i')
  let found = str.match(final)
  console.log(found ? found[1] : found)
}

startsWith("Hello world !", 'h', 0); // "H"
startsWith("Hello world !", 'wor?', 6); // "wor"
startsWith("Hello world !", 'wor?', 10); // null
startsWith("Hello world !", 'z', 0); // null

Как указано @ mark , мы можем использовать свойство source , если мы хотим, чтобы регулярное выражение передавалось в качестве аргумента функции

let startsWith = (str, reg, offset) =>{
  let regex = `^.{${0,offset}}(${reg.source})`
  let final = new RegExp(regex,'i')
  let found = str.match(final)
  console.log(found ? found[1] : found)
}

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
...