我有一个可以包含各种信息的字符串,当我无法确定字符串中GUID的位置时,我需要从中对GUID进行子串。
字符串的可能版本
STRINGVAR =电子邮件:name@company.com&的室:b83edd0d-fec5-4ec0-8055-60bc0d8eb4b6
STRINGVAR =电子邮件:name@company.com&的室:b83edd0d-fec5-4ec0-8055-60bc0d8eb4b6 &安培;主机=主机名;
STRINGVAR =电子邮件:name@company.com&位置= SomeCity&安培;的室:b83edd0d-fec5-4ec0-8055-60bc0d8eb4b6
字符串中还有一些其他字符,其中包含更多或更少的字段,它始终至少包含GUID。
我所拥有的粗略版本:
var room = str.substring(str.lastIndex(room),str.lastIndex(;))
if room.length !== 36
var room = str.substring(str.lastIndex(room),str.lastIndexOf(&)
必须有更清洁的方法吗?
答案 0 :(得分:2)
必须有更清洁的方法吗?
有 - REGEX。
var guid = str.match(/room:([^&]+)/);
匹配(如果找到)将在guid[0]
中生效,guid[1]
中只有guid(减去“room:”)。
答案 1 :(得分:2)
您可以使用字符串操作,例如:
var stringVar1 = "email:name@company.com&room:b83edd0d-fec5-4ec0-8055-60bc0d8eb4b6";
var stringVar2 = "email:name@company.com&room:b83edd0d-fec5-4ec0-8055-60bc0d8eb4b6&host=HOSTNAME";
var stringVar3 = "email:name@company.com&location=SomeCity&room:b83edd0d-fec5-4ec0-8055-60bc0d8eb4b6";
function getRoomId(input) {
return input
.split("&") //separate into chunks
.find(part => part.startsWith("room:")) //see which starts with room
.split(":")[1]; //split and return the second part, which is the GUID
}
console.log(getRoomId(stringVar1));
console.log(getRoomId(stringVar2));
console.log(getRoomId(stringVar3));
或者,更“愚蠢”的方法是在你想要的字符串周围剪切。主要的缺点是它看起来并不像“花哨”,但另一方面,它可以在所有浏览器中使用。
var stringVar1 = "email:name@company.com&room:b83edd0d-fec5-4ec0-8055-60bc0d8eb4b6";
var stringVar2 = "email:name@company.com&room:b83edd0d-fec5-4ec0-8055-60bc0d8eb4b6&host=HOSTNAME";
var stringVar3 = "email:name@company.com&location=SomeCity&room:b83edd0d-fec5-4ec0-8055-60bc0d8eb4b6";
function getRoomId(input) {
return input
.split("room:")[1] //find the part of the string that starts with "room:" and cut there
.split("&", 1)[0]; //cut again at the next "&" and return the first part
}
console.log(getRoomId(stringVar1));
console.log(getRoomId(stringVar2));
console.log(getRoomId(stringVar3));
最后,您可以对indeces进行更简单的查找,这也适用于所有浏览器:
var stringVar1 = "email:name@company.com&room:b83edd0d-fec5-4ec0-8055-60bc0d8eb4b6";
var stringVar2 = "email:name@company.com&room:b83edd0d-fec5-4ec0-8055-60bc0d8eb4b6&host=HOSTNAME";
var stringVar3 = "email:name@company.com&location=SomeCity&room:b83edd0d-fec5-4ec0-8055-60bc0d8eb4b6";
function getRoomId(input) {
var start = input.indexOf("room:") + 5; //the index is the beginning of "room:", so add 5 characters to get rid of it
var end = input.indexOf("&", start); //the next "&" after "room:" will be after the GUID
end = end !== -1? end : input.length; //if there is no next "&", then grab everything until the end of the string
return input.slice(start, end);
}
console.log(getRoomId(stringVar1));
console.log(getRoomId(stringVar2));
console.log(getRoomId(stringVar3));
还有其他的变化,但这个想法是通过将其视为字符串来解决它很简单。
答案 2 :(得分:1)
使用此正则表达式
/(room:[a-zA-Z0-9]+\-[a-zA-Z0-9]+\-[a-zA-Z0-9]+\-[0-9]+\-[a-zA-Z0-9]+)/
将匹配以下数据:
room:b83edd0d-fec5-4ec0-8055-60bc0d8eb4b6
room:b83edd0d-fec5-4ec0-8055-60bc0d8eb4b6
room:b83edd0d-fec5-4ec0-8055-60bc0d8eb4b6
以下是匹配:demo
答案 3 :(得分:1)
正则表达式是一个不错的选择,但它使代码难以阅读。
var stringValue = "stringVar=email:name@company.com&room:b83edd0d-fec5-4ec0-8055-60bc0d8eb4b6&host=HOSTNAME;"
var pattern = /[\da-zA-Z]{8}-([\da-zA-Z]{4}-){3}[\da-zA-Z]{12}/;
var found = stringValue.match(pattern)
console.log(found[0]);

此代码片段使用字符串值并使用Regex表达式执行简单的match,这将返回一个结果数组,我只是将第一个索引值从结果数组中取出。
答案 4 :(得分:1)
您的房间' guid只包含十六进制字符。使用简单的匹配正则表达式来捕获您需要的内容:
/&room:([a-f\d-]+)/i
如果room
可能显示为字符串中的第一个字段(在其开头),则可以将其增强以匹配字符串的开头:
/(?:^|&)room:([a-f\d-]+)/i
^^^^
请参阅regex demo
<强>详情:
&room:
- 匹配文字字符序列&room:
((?:^|&)
是一个替换组,以匹配起始字符串位置(^
)或({{1} })|
符号)&
- 匹配并捕获到第1组中([a-f\d-]+)
和a-f
范围内的ASCII字母的一个或多个字符(作为{{1} }是一个不区分大小写的模式修饰符),数字(A-F
)或/i
。
\d
&#13;
答案 5 :(得分:1)
var str = "email:name@company.com&room:b83edd0d-fec5-4ec0-8055-60bc0d8eb4b6;";
var room = str.split("room:")[str.split("room:").length-1].split("&")[0].split(";")[0];
//b83edd0d-fec5-4ec0-8055-60bc0d8eb4b6
&#13;
答案 6 :(得分:1)
我试图创建一个可以返回对象的函数。
注意:我稍微更改了格式。我在第三种格式中添加了city:SomeCity
。
基本格式是,您可以=
具有字符串值或对象,但不能同时具有两者。因此,&host=HOSTNAME
很好,但location=SomeCity&room:b83edd0d-fec5-4ec0-8055-60bc0d8eb4b6
不是,我已将其更改为location=city:SomeCity&room:b83edd0d-fec5-4ec0-8055-60bc0d8eb4b6;
点是=
应该为每对包含:
或不包含function getObjectFromCookieStr(str){
var r = {};
str.split("=").reduce(function(p,c){
var k = ''
var o = c.split('&').reduce(function(p,c){
if(c.indexOf(':') > -1){
var kv = c.split(':');
p[kv[0]] = kv[1]
}
else{
k=c;
}
return p;
}, {});
r[p] = Object.keys(o).length >0 ? o : c
return k;
});
return r;
}
var s1 = "stringVar=email:name@company.com&room:b83edd0d-fec5-4ec0-8055-60bc0d8eb4b6"
var s2 = "stringVar=email:name@company.com&room:b83edd0d-fec5-4ec0-8055-60bc0d8eb4b6&host=HOSTNAME";
var s3 = "stringVar=email:name@company.com&location=city:SomeCity&room:b83edd0d-fec5-4ec0-8055-60bc0d8eb4b6";
console.log(getObjectFromCookieStr(s1))
console.log(getObjectFromCookieStr(s2))
console.log(getObjectFromCookieStr(s3))
的值。
function searchKeyInObj(obj, searckKey) {
if (JSON.stringify(obj).indexOf(searckKey) < 0) return;
for (var k in obj) {
if (typeof(obj[k]) === 'object') {
var v = searchKeyInObj(obj[k], searckKey);
if (v) return v
} else if (k === searckKey) {
return obj[k];
}
}
}
现在我们有了一个对象,你只需要遍历对象来获取值。您可以使用以下功能在对象中搜索。
Optional
您可以按照JSFiddle
进行测试