来自可变内容

时间:2016-10-21 10:11:02

标签: javascript string substring

我有一个可以包含各种信息的字符串,当我无法确定字符串中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(&)

必须有更清洁的方法吗?

7 个答案:

答案 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,这将返回一个结果数组,我只是将第一个索引值从结果数组中取出。

http://regexr.com/3amuu

答案 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

&#13;
&#13;
\d
&#13;
&#13;
&#13;

答案 5 :(得分:1)

&#13;
&#13;
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;
&#13;
&#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

进行测试