regex JavaScript正则表达式数据提取和分组问题

vyu0f0g1  于 2023-10-22  发布在  Java
关注(0)|答案(2)|浏览(84)

我有这些行的文本行

Il Messaggero Roma 22 settembre 2023
Il Messaggero Roma 21 settembre 2023
Il Messaggero 22 settembre 2023
Il Messaggero 21 settembre 2023
Il Messaggero Roma 21 agosto 2023
Il Messaggero Roma 20 agosto 2023
Le Grandi Glorie del Rock – 15 febbraio 2023
Corriere della Sera Sette 26 agosto 2023

我试着用这些名字把它们分组

Il Messaggero Roma [settembre 2023]
Il Messaggero Roma [agosto 2023]
Il Messaggero [settembre 2023]
Le Grandi Glorie del Rock - [febbraio 2023]
Corriere della Sera Sette [agosto 2023]

相反,这些行被错误地分组,包含不正确的内容和名称

settembre [settembre]
agosto [agosto]
febbraio [febbraio]

Corriere della Sera Sette 25 Agosto 2023“和“Il Messaggero“被错误地包含在

settembre [settembre]
agosto [agosto]

但它们必须被视为不同的元素。这张图片显示了错误的分组:

我尝试用这个代码

对文本进行分组的功能,例如Il messaggero 21 settembre 2023Le Grandi Glorie del Rock – 15 febbraio 2023

function groupByDate(data) {
    var groupedData = {};
    data.forEach(function(item) {
        var date = item.id.match(/\d{1,2}\s(?:gennaio|febbraio|marzo|aprile|maggio|giugno|luglio|agosto|settembre|ottobre|novembre|dicembre)\s\d{4}/i);
        if (date) {
            date = date[0].toLowerCase();
            if (!groupedData[date]) {
                groupedData[date] = [];
            }
            groupedData[date].push(item);
        } else {
            if (!groupedData['other']) {
                groupedData['other'] = [];
            }
            groupedData['other'].push(item);
        }
    });
    return groupedData;
}

正则表达式进行匹配

function extractGroup(text) {
    var containsNxM = /\d+x\d+/.test(text);
    var containsDate = /\d{1,2}\s(?:gennaio|febbraio|marzo|aprile|maggio|giugno|luglio|agosto|settembre|ottobre|novembre|dicembre)\s\d{4}/i.test(text);

    if (containsNxM) {
        var match = text.match(/^([a-zA-Z\s]+\s\d+x)/);
        return match ? match[0] : '';
    } else if (containsDate) {
        var match = text.match(/\d{1,2}\s([a-zA-Z]+)\s\d{4}/i);
        return match ? match[1] : '';
    } else {
        return text;
    }
}

表初始化

function initializeDataTable(data) {
    if (dataTable) {
        dataTable.destroy();
    }
    var tableData = [];
    if (grouped) {
        var groupedData = {};

        data.forEach(function(item) {
            var groupName = extractGroup(item.id);
            if (!groupedData[groupName]) {
                groupedData[groupName] = [];
            }
            groupedData[groupName].push(item);
        });

        // Inserisci un log per verificare groupedData
        console.log("groupedData:", groupedData);

        for (var groupName in groupedData) {
            if (groupedData.hasOwnProperty(groupName)) {
                var groupItems = groupedData[groupName];
                var badgeText = groupItems[0].badge;
                var badgeClass = 'badge-' + (badgeText || '').toLowerCase();
                var commonText = groupName.split('[')[0].trim(); // Estrai la parte comune dal nome
                tableData.push({
                    "checkbox": '<input type="checkbox" class="grouped-checkbox">',
                    "id": '<span class="badge ' + badgeClass + '">' + badgeText + '</span> ' + commonText + ' [' + groupName + ']', // Cambio qui
                    "username": groupItems.map(function(item) {
                        return item.username;
                    }).join('<br>'),
                    "extra": '<button class="downloadBtn">Scarica</button>',
                    "showLinks": groupItems.length > 2
                });
            }
        }

表初始化的完整代码是HERE,但我认为这对于此目的是无用的

de90aj5v

de90aj5v1#

您的分组键需要保留日期之前的文本部分,并删除日期编号。为此使用regexp替换。

function groupByDate(data) {
  var groupedData = {};
  data.forEach(function(item) {
    var date = item.id.replace(/^(.*?)\d{1,2}\s((?:gennaio|febbraio|marzo|aprile|maggio|giugno|luglio|agosto|settembre|ottobre|novembre|dicembre)\s\d{4})/i, '$1[$2]');
    if (date != item.id) {
      key = date[0].toLowerCase();
    } else {
      key = 'other';
    }
    if (!groupedData[key]) {
      groupedData[key] = [];
    }
    groupedData[key].push(item);
  });
  return groupedData;
}
kcwpcxri

kcwpcxri2#

我以这种方式解决:我为每个单选按钮/徽章创建2个函数

function extractGroup(text) {
    var containsNxM = /\d+x\d+/.test(text);
    if (containsNxM) {
        var match = text.match(/^([a-zA-Z\s]+\s\d+x)/);
        return match ? match[0] : '';
    } else {
        return text;
    }
}

而这

function groupNewspapers(text) {
  var containsHash = /#\s\d+\s\w+\s\d+/g.test(text);
  if (containsHash) {
    var match = text.match(/^([a-zA-Z\s]+)\s#\s\d+\s(\w+\s\d+)/gm);
    return match.map(function(line) {
      return line.replace(/^([a-zA-Z\s]+)\s#\s\d+\s(\w+\s\d+)/, '$1 # $2').replace(/^\d+\s\w+\s/, '');
    }).join('\n');
  } else {
    return text;
  }
}

对于表的初始化,

function initializeDataTable(data) {
    if (dataTable) {
        dataTable.destroy();
    }
    var tableData = [];
    if (grouped) {
        groupedData = {};
        data.forEach(function(item) {
            var groupName;
            if (item.badge === 'serietv') {
                groupName = extractGroup(item.id);
            } else if (item.badge === 'quotidiani') {
                groupName = groupNewspapers(item.id);
            }

            if (!groupedData[groupName]) {
                groupedData[groupName] = [];
            }
            groupedData[groupName].push(item);
        });

相关问题