1

我一直在尝试验证包含 LRC 文件 http://en.wikipedia.org/wiki/LRC_%28file_format%29的字符串

并想通过正则表达式验证文件的格式是否正确。这将是有效的,不仅仅是以 [mm:ss.xx] 开头的行,还有 [mm:ss] 因为默认情况下它将是 xx=00

因此,如果文件更正与否,它的想法是返回,还包括可能出现在文件中的 ID 标签。

提前致谢

4

1 回答 1

0

我猜您需要遍历文件中的每一行并针对正则表达式进行测试以检查它是否与语法匹配。如果正则表达式失败,那么您显然会 return false。一个合适的正则表达式可能是这样的:

\[[0-9]{2}\:[0-9]{2}(\.[0-9]{2})?\]([\w:\s]+)

这将匹配两者:

[00:29.02]Line 6 lyrics
[00:29]Line 6 lyrics

并为您提供第二个匹配组,以防您想要获取歌词。

为了匹配标签,您可能需要一个正则表达式:

\[([a-z]+)\:(.+)\]

哪个将匹配:

[au:Written by Kal Mann / Dave Appell, 1961]
[length: 2:23]

虽然这假设标签名称中没有数字。它为标签名称和值提供了两个捕获组。

为了做你想做的事,我创建了一个jsFiddle,我认为它展示了你想要的功能。它假定 LRC 数据由\n字符分隔。示例方法如下:

function test_LRC(str) {
    var lyric_regex = /\[[0-9]{2}\:[0-9]{2}(\.[0-9]{2})?\](.+)/i;
    var tag_regex = /\[([a-z]+)\:(.+)\]/i;
    var LRC = str.split('\n');
    var len = LRC.length;
    var tags = [];
    var valid = true;

    for (var i = 0; i < len; i++) {
        var line = LRC[i].trim();
        if (line !== '') {
            if (tag_regex.test(line)) {
                var groups = tag_regex.exec(line);
                tags.push({'tag': groups[1], 'value': groups[2].trim()});
            } else if (!lyric_regex.test(line)) {
                valid = false;
                break;
            }
        }
    }

    return { 'valid': valid, 'tags': tags };
}
于 2013-02-12T12:11:07.443 回答