Javascript\Node.JS抓取逻辑,在字符串中查找时间

Javascript\Node.JS抓取逻辑,在字符串中查找时间,javascript,jquery,node.js,web-scraping,Javascript,Jquery,Node.js,Web Scraping,我正在尝试创建一个通过本地站点获取事件信息的刮板。我在提取事件时间时遇到问题,因为每个人都以不同的格式输入事件时间。不管怎么说,我想知道是否有一个好方法来寻找这些“上午、上午、下午、下午”中的一个,然后在上午或下午之前得到任何数字 我知道有类似的事情,但它不够动态 var rawTime = "String blab la bla 10:00 p.m."; toParse = rawTime.substring(rawTime.indexOf('p.m.') - 6); 最

我正在尝试创建一个通过本地站点获取事件信息的刮板。我在提取事件时间时遇到问题,因为每个人都以不同的格式输入事件时间。不管怎么说,我想知道是否有一个好方法来寻找这些“上午、上午、下午、下午”中的一个,然后在上午或下午之前得到任何数字

我知道有类似的事情,但它不够动态

var rawTime = "String blab la bla 10:00 p.m.";
toParse = rawTime.substring(rawTime.indexOf('p.m.') - 6);
最好的办法是找到indexOf,创建一个数组,然后让while循环“后退”,直到返回一个空格或非数字


但是我会遇到这样的问题,人们会在晚上10:00和10:00输入。因为在下午之前有一个空格。

最好是使用正则表达式,因为它完全支持人类输入时间所需要的模糊模式匹配

/\d{1,2}(:\d{2})?\s*([ap][.]?m[.]?)?/i

可以,它也支持上午10点和上午9点。

下面是一个代码示例,可以用于您的示例

var ts = [];

ts.push('String blab la bla 10:00 p.m.');
ts.push('String blab la bla 10:00 pm');
ts.push('String blab la bla 10:00 am');
ts.push('String blab la bla 10:00 a.m.');

for(var i=0; i<ts.length; i++){
    var match = ts[i].match(/(\d+:?\d+)\s?[ap]\.?m/) || []
    console.log(match[1]);
}
var ts=[];
ts.push(“字符串blab la bla晚上10:00”);
ts.push(“字符串blab la bla 10:00 pm”);
ts.push(上午10:00时的弦乐);
ts.push(上午10:00时的弦乐);

对于(var i=0;i我不是正则表达式大师,但希望这能帮助您:

var rawTime = "String etc 10:00 p.m. etc etc"
var result = rawTime.match(/(0?[1-9]|1[012]):([0-5]\d)[ ]?([APap].?[mM].?)/);
if (result)
{
    alert('Hour: ' + result[1] +
          '\nMinute: ' + result[2] +
          '\nAM/PM: ' + result[3].replace(/\./g, '').toUpperCase());
}

上面的正则表达式基本上可以匹配任何表示子午线指示器的方式,大写或小写以及有无句点(分钟后有无空格)。它还基本上验证了它是一个实时的AM/PM时间(不过请注意,您可能希望将其调整为“军事”时间,例如14:15而不是2:15)

我写了一些东西,我不确定我的逻辑是否正确。我认为它应该采用几乎任何格式。唯一的问题是,如果字符串前面有一个数字,例如一个价格……那么,尝试解决这个问题可能会很奇怪

var re = /(a.m.|p.m.|pm|am)/g, // Filter By 
str = "String blab la bla 10 to 12:00 a.m. asdfasdfas"; // String To Test

var timeArray = new Array();
var timeStamp = new Array();

while ((matcher = re.exec(str)) != null) {
    timeArray.push(matcher.index);
    timeStamp.push(matcher[0]);
}

// Get Start And End Time
startTime = str.substring(timeArray[0] - 6, timeArray[0]);
finishTime = str.substring(timeArray[1] - 13, timeArray[1]);

if (startTime.length == 2) {
    finishTime = startTime.substr(1,2);
    startTime = startTime.slice(0,1);
} else {
console.log(finishTime);
var matches = /(-|to|till)/g;

if (finishTime.match(matches) != null) { 

    var splitTime = startTime.split( matches );
    var slpitTimeFinish = finishTime.split( matches );

    if (timeStamp.length > 1) {
        finishTime = slpitTimeFinish[2].replace(/[A-Za-z$.]/g, "");
        startTime = splitTime[0].replace(/[A-Za-z$.]/g, "");
    } else {
        finishTime = slpitTimeFinish[2].replace(/[A-Za-z$.]/g, "");
        startTime = slpitTimeFinish[0].replace(/[A-Za-z$.]/g, "");
    }

    startTime = startTime.replace(/\s+/g, ''); // Remove Spaces
    finishTime = finishTime.replace(/\s+/g, ''); // Remove Spaces

} else {
    finishTime = finishTime.replace(/[A-Za-z$.]/g, "");
    finishTime = finishTime.replace(/\s+/g, ''); // Remove Spaces

    startTime = startTime.replace(/[A-Za-z$.]/g, "");
    startTime = startTime.replace(/\s+/g, ''); // Remove Spaces

 }
}

// Get Time Stamp

if (timeStamp.length > 1) {
    eventStartStamp = timeStamp[0];
    eventEndStamp = timeStamp[1];
} else {
    eventStartStamp = timeStamp[0];
    eventEndStamp = timeStamp[0];
}


console.log ("Event Starts At "+ startTime + " " + eventStartStamp +" Ends At "+ finishTime + " " + eventEndStamp ); 
这里是我做的一些测试,如果有人有更好的方法,或者建议他们的方法,我洗耳恭听。这可能是编码过度了

str = "String blab la bla 12a.m. to 1pm asdfasdfas";
returns "Event Starts At 12 a.m. Ends At 1 pm

str = "String blab la bla 12-1pm asdfasdfas";
returns "Event Starts At 12 pm Ends At 1 pm


str = "String blab la bla 12:00a.m. to 1:00 p.m. asdfasdfas"
returns "Event Starts At 12 am Ends At 1 pm



 str = "String blab la bla 12:00 to 1:00 p.m. asdfasdfas"` 
 returns "Event Starts At 12:00 p.m. Ends at 1:00 p.m.


str = "String blab la bla 12:00 - 1:00 p.m. asdfasdfas" 
returns "Event Starts At 12:00 p.m. Ends at 1:00 p.m. 
如果有人在晚上7点到10点的时候输入,也应该可以。我只需要想一想如何在时间之前清除任何东西,在这种情况下,这可能会发生。我想这将获得相当数量的好数据。如果有人有更好的解决方案,请告诉我。我知道这是一个很大的过度编码,我可以将其减少一点,我只是更直观艾尔比大多数人都好