我有一个字符串,我想要一个正则表达式来查找数字之前是否有空格,如果是,则在此之前添加一个空格。 例如:" TAXI CABS ONLY THURS-FRI-SAT 11:30 PM-03:00" 结果:" TAXI CABS只有THURS-FRI-SAT 11:30 PM-3:00 AM"
答案 0 :(得分:1)
我不是正则表达专家,但最终得到了这两个变体:
replace
方法的第二个参数的第一个变体:
var str = 'TAXI CABS ONLY THURS-FRI-SAT 11:30PM-3:00AM';
var strUpdated = str.replace(/\d?\d:\d?\d(AM|PM)/g, function(m){
return m.replace(/(AM|PM)/g, " $1");
});
console.log('old: ' + str);
console.log('new: ' + strUpdated);

replace
方法的第二个参数的第二个变体:
var str = 'TAXI CABS ONLY THURS-FRI-SAT 11:30PM-3:00AM';
var strUpdated = str.replace(/(\d?\d:\d?\d)(AM|PM)/g, "$1 $2");
console.log('old: ' + str);
console.log('new: ' + strUpdated);
console.log('----------------------------------');
var str = 'Another test 1:22 AM. This 12:05PM and this 12:50PN ';
var strUpdated = str.replace(/(\d?\d:\d?\d)(AM|PM)/g, "$1 $2");
console.log('old: ' + str);
console.log('new: ' + strUpdated);

现在我将尝试解释正则表达式的作用:)
(\d?\d:\d?\d)
- 这将匹配1:1,1:22,1:22,11:2等数字,制动器用于制作组,以便稍后可以在替换正则表达式中使用它(第二个参数替换方法)(AM|PM)
- 这是另一个组(我们在放置方括号时创建)以匹配文字AM或PM 编辑(以回应comment )
我可以迅速提出的建议是在另一个正则表达式中处理11AM-6PM OR 8A-6P
之类的情况,而不是使当前正则表达式复杂化。看看下面的代码 - 第二个replace
正在完成这项工作:
var str = 'TAXI CABS ONLY THURS-FRI-SAT 11:30PM-3:00AM \r\n 11AM-6PM OR 8A-6P 11M-6M OR 12A-15P';
var strUpdated = str.replace(/(\d?\d:\d?\d)(AM|PM)/g, "$1 $2").replace(/(\d?\d)(AM|PM|A|P)/g, "$1 $2");
console.log('old: ' + str);
console.log('new: ' + strUpdated);

答案 1 :(得分:0)
为什么不检查一个数字是否与一个字母相邻,如果是,在它们之间加一个空格?
检查所有数字[0-9]
,然后检查字母是否与[A-Zz-A]
相邻。然后用空格替换第n个字符(由$1
定义)并将原始字符放在$2
位置。
let str = 'TAXI CABS ONLY THURS-FRI-SAT 11:30PM-3:00AM';
str = str.replace(/([0-9])([A-Za-z])/ig, '$1 $2');