javascript требуется регулярное выражение, только числа в скобках, несколько - PullRequest
0 голосов
/ 10 марта 2020

Для обновления / решения проблемы прокрутите вниз или нажмите здесь

Ориг. вопрос: Я хочу написать функцию на чистом javascript, которая использует Jquery -подобный селектор с объявлениями: eq (0), скажем, например, для итерации по таблице, такой как

$('tr:eq(8) > td:eq(13)').val();

Для этого я пытаюсь написать регулярное выражение, и я застрял здесь

var str = "I don't want +5+ and not 10 or [12] nor (120) but :eq(5) and :eq(120)";
var matches = str.match(/\:eq\(\d+(\d{1,2})\)?/g);
console.log('matches: '+matches);

, который возвращает только matches: :eq(120), но не matches: :eq(5),:eq(120), как хотелось. Что я могу сделать здесь?

Ответы [ 2 ]

4 голосов
/ 10 марта 2020

Вы можете упростить свое регулярное выражение:

var str = "I don't want +5+ and not 10 or [12] nor (120) but :eq(5) and :eq(120)";
const matches = str.match(/:eq\(\d+\)/g);
console.log('matches: '+matches);
0 голосов
/ 10 марта 2020

ОБНОВЛЕНИЕ УСПЕХА / РЕЗУЛЬТАТОВ , чтобы поделиться своими советами:

У меня есть таблица

<table>

    <tr>
        <td><span>1</span></td>
        <td><span id="span2">2</span></td>
        <td><span>3</span></td>
        <td><span>4</span></td>
    </tr>

    <tr>
        <td><span>5</span></td>
        <td><span>6</span></td>
        <td><span>7</span></td>
        <td><span>8</span></td>
    </tr>

</table>

, и, используя предыдущие ответы, я написал этот небольшой скрипт, который начало простого механизма выбора.

const ltrim = (haystack, needle) => {
    var regex = new RegExp('^'+needle);
    return haystack.replace(regex, '');
}

const rtrim = (haystack, needle) => {
    var regex = new RegExp(needle+'$');
    return haystack.replace(regex, '');
}

const $ = (s) => {
    var el = document;

    if (!s.match(/:eq/g)) {
        var cut_index = Math.max(s.lastIndexOf('>'),s.lastIndexOf(' '))+1;
        var last = s.substring(cut_index);
        if (/#/.test(last)) el = el.querySelector(s);
        else el = el.querySelectorAll(s);
    }
    else {
        var m = s.match(/:eq\(\d+\)/g);
        var p = s.split(/:eq\(\d+\)/g);
        for (i in p) {

            if (p[i] == '') i++;
            else {
                if (i == p.length-1) {
                    if (p[i].match(/#/)) el = el.querySelector(p[i]);
                    else el = el.querySelectorAll(p[i]);
                }
                else el = el.querySelectorAll(p[i])[m[i].match(/\d+/g)];
            }
        }
    }
    return el;
}

Теперь я могу перебирать таблицу, используя jquery -подобный синтаксис селектора с

alert($('table tr td span#span2').innerHTML); // 2
alert($('table tr:eq(1) td:eq(1) span:eq(0)').innerHTML); // 6
alert($('table tr:eq(1) td:eq(2) span')[0].innerHTML); // 7

, и я счастлив на данный момент. Это выражение, например

$('table tr:eq(1) td span').forEach(elem => {elem.classList.add('yellow')});

, использует обычный синтаксис JS, чтобы выделить полную строку или только одну ячейку:

$('table tr:eq(1) td span:eq(2)').classList.add('yellow');

Я не уверен насчет поддержки других jquery -подобных css селекторов, увидим в будущем. В случае улучшений дальнейшие обновления будут здесь.

...