具有动态要求的正则表达式

时间:2016-03-13 10:03:49

标签: javascript regex

假设我有字符串:

var a = '/c/Slug-A/Slug-B/Slug-C'

我有3种可能性:

var b = 'Slug-A' || 'Slug-B' || 'Slug-C'

我的期望:

if (b === 'Slug-A') return 'Slug B - Slug C';
if (b === 'Slug-B') return 'Slug A - Slug C';
if (b === 'Slug-C') return 'Slug A - Slug B';

到目前为止我做了什么:

a.replace(b,'')
.replace(/\/c\//,'') // clear /c/
.replace(/-/g,' ')
.replace(/\//g,' - ')

然后,我被困了

任何帮助将不胜感激。感谢

3 个答案:

答案 0 :(得分:1)

试试这个:

var a = '/c/Slug-A/Slug-B/Slug-C'
var b = 'Slug-A' || 'Slug-B' || 'Slug-C'
var reg = new RegExp(b.replace(/([A-z]$)/,function(val){return '[^'+val+']'}),'g');
a.match(reg).map(function(val){return val.replace('-',' ')}).join(' - ');

<强>阐释:

替换字符串b捕获字符串的最后一个字符串,并将其替换为^正则表达式符号。这意味着它将忽略它而不是捕获它。

这意味着它意味着它现在只匹配不包含最后一个字符的Slag-

所有要做的就是用你喜欢的任何连接来回复它。

答案 1 :(得分:1)

试试这个,我尽可能简单。

var a = '/c/Slug-A/Slug-B/Slug-C';
var b = 'Slug-A';

var regex = new RegExp(b+'|\/c\/|-|\/','g');

alert(a.replace(regex, " ").trim().replace(/(\s.*?)\s+/,'$1 - '));

//OR

alert(a.replace(regex, " ").trim().match(/\w+\s\w/g).join(' - '));

<强>解释

1)b+'|\/c\/|-|\/','g' =匹配b值,/c/-/

2)a.replace(regex, " ") =用空格替换所有匹配的部分。所以a将是Slug A Slug B

3).replace(/(\s.*?)\s+/,'$1 - ') =匹配空格内任何内容的两个空格。然后将其替换为附加的match + ' - '

注意我们已在正则表达式(\s.*?)中对部分(\s.*?)\s+进行了分组。因此,此分组已完成,以便在使用新文本替换它时可以使用它。 $1保留匹配文本的分组部分$1 = " A"。所以我正在做的是匹配正则表达式:" A "并且只用" A" + " A" = " - "替换分组部分即" A - "

4).match(/\w+\s\w/g).join(' - ') =匹配字符后跟空格后跟一个字符的所有部分。 match将返回一系列匹配的部分。然后我使用join加入此数组。

答案 2 :(得分:0)

这样做

var a = '/c/Slug-A/Slug-B/Slug-C'
var b = 'Slug-A'
 //var b = 'Slug-B'
 //var b = 'Slug-C'

var k = a.replace(b,'')
.replace(/\/c\//,'') // clear /c/
.replace(/-/g,' ')
.match(/[a-zA-Z -]+/g).join(" - ")

console.log(k)

工作阵列here