假设我有像
这样的东西var url = 'http://stackoverflow.com/questions/24a34b83c72/js-regex-get-values-between-two-characters'
如何使用纯javascript获取24a34b83c72
ID?我知道它总是在questions/
部分之后,无论它是否包含数字或符号,它都需要在下一个/
之前结束。我尝试了类似的东西;
url.substring(url.lastIndexOf('questions/'))
但是这导致了整个帖子。我尝试了正常的表达,但我最接近的是:
var regex = /"details\/"[a-zA-Z0-9]+"\/"/
任何人都可以帮助我吗?
答案 0 :(得分:2)
正则表达式对于更复杂的模式或重复匹配非常有用。您的要求简单而独特。
按'/'
拆分字符串,找到'questions'
的索引,结果在下一个索引中:
var parts = url.split('/');
var result = parts[parts.indexOf('questions') + 1];
答案 1 :(得分:1)
答案 2 :(得分:0)
这对我有用,你的例子在Firefox控制台上:
>> var url = 'http://stackoverflow.com/questions/24a34b83c72/js-regex- get-values-between-two-characters'
>> var regex = /questions\/([a-zA-Z0-9]+)\//
>> regex.exec(url)
Array [ "questions/24a34b83c72/", "24a34b83c72" ]
数组的第二个元素应该是你要找的。 p>
答案 3 :(得分:0)
[另一个选项]
首先解释URL字符串,然后解释解释为我返回的内容( as a Abtract syntax tree)。以下命令块将在执行以下循环时使用url
字符串(或解释),逐步构建代表性数组!
var curChar,
directoryPassed,//not yet
expectGetValue,
getContent="",
getStarted,//? not started ($_GET)
inPort,//not reading port
portRead,//port not read yet
state=0,//first state
text="",
urlTree=[];
for(;;){
curChar=url.charAt(0);//first char
if(state===0){
//expects http... ws... file or https, for example.
if(curChar===""){
throw new Error("http:// expected.")
}else if(curChar===":"){
if(directoryPassed){
throw new Error("Unexpected token.")
}
urlTree.push({type:"URLProtocol",value:text});
text="";
state=1
}else{
text+=curChar
}
}else if(state===1){
//expects //...
if(url.substring(0,2)==="//"){
state=2;
url=url.substring(1)
}else if(curChar===""){
throw new Error("// expected.")
}
}else{
//expects anything correct: site.com/dir, localhost:8080, ?get=0, etc.
if(getStarted){
if(curChar==="="){
if(text.length===0){
throw new Error("Unexpected token.")
}else{
expectGetValue=true;
getContent=""
}
}else if(curChar==="&"){
if(expectGetValue||text.length!==0)
urlTree.push({type:"Variable",name:text,value: (getContent||true) });
expectGetValue=false;
text=""
}else if(curChar===""){
if(expectGetValue||text.length!==0)
urlTree.push({type:"Variable",name:text,value: (getContent||true) });
break
}else{
if(expectGetValue){
getContent+=curChar
}else{
text+=curChar
}
}
}else if(curChar==="."){
if(text.length===0){
throw new Error("Unexpected token.")
}else{
if(inPort){
throw new Error("Unexpected token in port.")
}else{
urlTree.push({type:"Name",value:text});
text=""
}
}
}else if(curChar===""){
if(text.length!==0){
if(inPort){
urlTree.push({type:"Port",value:text})
}else{
urlTree.push({type:"Name",value:text})
}
text=""
}else if(inPort){
throw new Error("Port not specified.")
}
break
}else if(curChar==="?"){
//$_GET starts here.
if(text.length!==0){
if(inPort){
urlTree.push({type:"Port",value:text})
}else{
urlTree.push({type:"Name",value:text})
}
text=""
}
getStarted=true;
urlTree.push({type:"Get"})
}else if(curChar==="/"){
if(text.length===0){
throw new Error("Unexpected token.")
}else{
directoryPassed=true;
if(inPort){
inPort=false;
urlTree.push({type:"Port",value:text})
}else{
urlTree.push({type:"Name",value:text})
}
text="";
urlTree.push({type:"NextDirectory"})
//New directory!
}
}else if(curChar===":"){
if(portRead||text.length===0){
throw new Error("Unexpected token.")
}else{
urlTree.push({type:"Text",value:text});
text="";
inPort=
portRead=true;
//Now the port will never be defined again.
}
}else if(inPort){
if(/[0-9]/.test(curChar)){
text+=curChar
}else{
throw new Error("Invalid port token.")
}
}else{
text+=curChar
}
}
url=url.substring(1)
}
一旦它运行,你就可以在urlTree
字符串中获得用base构造的url
数组。另外,您的URL当前在数组中返回以下树:
。树数组中的每个项目都是一个对象。每个对象都有属性type
。 type
告诉该项目代表什么。
在此解析中,有这些类型(在 string 中):
"URLProtocol"
- >它可能是http,https或其他任何东西。拥有属性:value
(协议字符串,如:" http"," ws"等)
"Name"
- >它的名字。示例:name.name ... name.com ...?name = 0;具有属性:value
(名称字符串)
"NextDirectory"
- >代表" /" - "打开了一个新目录"
"Get"
- > ?开始。 "现在可以声明URL变量"
"Variable"
- >代表 ?变量。具有以下属性:name
和value
;
基本。这就是全部。然后你可以用你自己的指令用数字循环解释数组。