【问题标题】:Empty value check by Regular Expression通过正则表达式检查空值
【发布时间】:2019-06-11 02:14:08
【问题描述】:
我有一个如下格式的字符串。
var commandString = 'Campaign: {campaign value} Group: {group value} Sort_By: {sort by value}'
我有以下两个问题
var commandString = 'Campaign: {campaign value} Group: {group value} Sort_By: {}' 的输出是什么如果像 Sort_By 这样的值为空
var commandString = 'Group: {group value} Sort_By: {sort by value}' 的输出是什么如果像 Campaign 这样的值为空当第一个值为空时,则需要为第二个值(如 Group)删除空间。
我没有找到任何想法,你能帮帮我吗。
【问题讨论】:
标签:
javascript
regex
typescript
【解决方案1】:
你可以使用这个正则表达式
(?:^|\s)[a-z_]+?:\s*\{\s*\}
-
(?:^|\s) - 字符串或空格字符的开头
-
[a-z_]+? - 匹配字母和_一次或多次
-
: - 匹配 :
-
\s*\{\s*\} - 匹配 {}
var str = 'Campaign: {campaign value} Group: {group value} Sort_By: {sort by value}'
let removeEmpty = (str) =>{
return str.replace(/(?:^|\s)[a-z_]+?:\s*\{\s*\}/gi,"").trim()
}
console.log(removeEmpty(str))
console.log(removeEmpty("Campaign: {campaign value} Group: {}"))
console.log(removeEmpty("Campaign: {} Group: {}"))
【解决方案2】:
我们会设计可选组以涵盖可能或潜在的选项,例如,我们可以从类似于以下的表达式开始:
(Campaign:(\s+)?{(.+)?})?(\s+)?Group:(\s+)?{(.+)?}(\s+)?Sort_By:(\s+)?{(.+)?}
const regex = /(Campaign:(\s+)?{(.+)?})?(\s+)?Group:(\s+)?{(.+)?}(\s+)?Sort_By:(\s+)?{(.+)?}/gm;
const str = `Campaign: {campaign value} Group: {group value} Sort_By: {sort by value}
Campaign: {campaign value} Group: {group value} Sort_By: {}
Group: {group value} Sort_By: {sort by value}
Campaign: {campaign value} Group: {group value} Sort_By: {sort by value}
Campaign: {campaign value} Group: {group value} Sort_By: {}
Group: {group value} Sort_By: {sort by value}`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
我们可以在我们希望有时拥有它的那些组的末尾使用?简单地添加更多可选空格,我们的表达式扩展为:
(Campaign(\s+)?:(\s+)?{(.+)?})?(\s+)?Group(\s+)?:(\s+)?{(.+)?}(\s+)?Sort_By(\s+)?:(\s+)?{(.+)?}
const regex = /(Campaign(\s+)?:(\s+)?{(.+)?})?(\s+)?Group(\s+)?:(\s+)?{(.+)?}(\s+)?Sort_By(\s+)?:(\s+)?{(.+)?}/gm;
const str = `Campaign: {campaign value} Group: {group value} Sort_By: {sort by value}
Campaign: {campaign value} Group: {group value} Sort_By: {}
Group: {group value} Sort_By: {sort by value}
Campaign: {campaign value} Group: {group value} Sort_By: {sort by value}
Campaign: {campaign value} Group: {group value} Sort_By: {}
Group: {group value} Sort_By: {sort by value}
Campaign : {campaign value} Group: {group value} Sort_By: {sort by value}
Campaign : {campaign value} Group: {group value} Sort_By : {}
Group : {group value} Sort_By : {sort by value}`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
正则表达式电路
jex.im 可视化正则表达式: