2013-07-06 5 views
1

У меня есть следующая функция, которая обнаруживает совпадение в текстовом поле и затем удаляет текущий блок.Номер возвращаемой строки в матче() Javascript

function deleteValue() { 
    var name = document.getElementById("name").value; 
    var textarea = document.getElementById("result"); 
    if (textarea.value.match("name")) 
    { 
    var lines = textarea.value.split('\n'); 
    lines.splice(3,8); 
    var modify = lines.join('\n'); 
    textarea.value = modify; 
    } 
} 

Я хотел бы иметь возможность добавить некоторую логику к этому, чтобы обнаружить, где name существует в текстовом поле и начать с этой линией. Какой метод javascript следует реализовать?

+0

Просто пройдите по линиям и проверьте каждый из них? – Bergi

+0

Я предпочел бы более точный метод. Я думал об этом, но лучше вернусь. –

+0

Почему вы думаете, что это будет неточно? Что вы понимаете под «правильным»? – Bergi

ответ

4

Вы можете обернуть логику в функцию, которая выполняет итерации по строкам заданного текста и возвращает список с индексами строк, соответствующих шаблону поиска (или точному поисковому запросу).
Затем вы можете использовать эти индексы соответствующим образом, например. удалив эту строку из исходного текста.

function findMatches(text, pattern) { 
    var matchingLines = []; 
    var allLines = text.split("\n"); 

    for (var i = 0; i < allLines.length; i++) { 
     if (allLines[i].match(pattern)) { 
      matchingLines.push(i); 
     } 
    } 

    return matchingLines; 
} 

См, также, это short demo.

Некоторые моменты, которые следует учитывать: * В приведенном выше примере «узор» обрабатывается JS как шаблон регулярного выражения, например. «тес». будет соответствовать «test», «tess», «tes6» и т. д. Если вы хотите вместо этого провести буквальное совпадение, замените allLines[i].match(pattern) на allLines[i].indexOf(pattern) != -1. * Предполагается, что строки заканчиваются на «\ n». Если ваши спецификации разные, измените их соответствующим образом. * В приведенной ниже краткой демонстрации часть поиска линии и часть удаления линии разделены, что приводит к более сложному коду (ради гибкости). Если вы хотите удалить только соответствующие линии, вы можете добиться этого за один проход, например:

function removeMatches(text, pattern) { 
    var outputLines = []; 
    var inputLines = text.split("\n"); 

    for (var i = 0; i < inputLines.length; i++) { 
     if (!inputLines[i].match(pattern)) { 
      outputLines.push(inputLines[i]); 
     } 
    } 

    return outputLines.join("\n"); 
} 
+0

Спасибо, я ценю объяснение и пример. Отлично сработано. –

Смежные вопросы