字符串中查找嵌套书名号 ,一开始想用正则来做的,最后发现正则不可能达到我的需求(可能是我正则理解不够,哈哈),所以写下了这个方法:只做了三层,如果你要更多,可以自己添加,哈哈

//提取查询关键字,sourceData:要检索的字符串;startMarker:起始符号标记;endMarker:结束符号标记
function checkKeywordFromstr(str, startMarker, endMarker) {

let startMarkers = [];//存放所有起始标记的下标
let endMarkers = [];//存放所有结束标记的下标

//递归查找标记下标,存放到对应的数组中
(function iterator(start, end) {
//如果不存在标记,那么结束递归
if (start == -1 && end == -1) {
return;
} else {
//从字符串下标为零处查找或者从及找到下标的下一位开始查找
start = sourceData.indexOf(startMarker, start + 1);
end = sourceData.indexOf(endMarker, end + 1);

//将查找到的下标存入对应数组
startMarkers.push(start);
endMarkers.push(end);
iterator(start, end);//递归调用
}
})(0, 0);

let ret= "";//临时存放检索到的单个关键字
let rets = [];//存放检索到的关键字
//for循环,为每一个起始标记配对
for (let i = 0; i < startMarkers.length - 1; i++){
//如果标记嵌套大于一层
if (i + 1 < (startMarkers.length - 1) && startMarkers[i + 1] < endMarkers[i]){
//如果标记嵌套大于二层
if (i + 2 < (startMarkers.length - 1) && startMarkers[i + 2] < endMarkers[i + 1]){
//如果标记嵌套大于三层
if (i + 3 < (startMarkers.length - 1) && startMarkers[i + 3] < endMarkers[i + 2]){
ret = sourceData.slice(startMarkers[i], endMarkers[i + 3] + 1);
rets.push(ret);
i = i + 3;//起始标记数组下标后移三位
} else {
ret = sourceData.slice(startMarkers[i], endMarkers[i + 2] + 1);
rets.push(ret);
i = i + 2;
}
} else {
ret = sourceData.slice(startMarkers[i], endMarkers[i + 1] + 1);
rets.push(ret);
i = i + 1;
}

} else {
ret = sourceData.slice(startMarkers[i], endMarkers[i] + 1);
rets.push(ret);
}
}
return rets;
}
let str = '看《西游记》很开心,有这东西《人民共和国《阿萨》什么的》;还有《撒的《Safari》和《苏打粉》都是》';
checkKeywordFromstr(str,'《','》');   
// ["《西游记》", "《人民共和国《阿萨》什么的》", "《撒的《Safari》和《苏打粉》都是》"]

JavaScript 嵌套 书名号 查询的更多相关文章

  1. Javascript实现Linq查询方式

    Linq是.net平台一个重要的技术,全称Language Integrated Query.通过构建快速查询语句,可快速从数据库或集合中筛选数据集.以查询数据库相同的方式操作内存数据. 在ECMAS ...

  2. ylb:子查询(嵌套子查询)和子查询(相关子查询)

    ylbtech-SQL Server:SQL Server-子查询(嵌套子查询)和子查询(相关子查询) SQL Server 子查询(嵌套子查询)和子查询(相关子查询). 1,ylb:1,子查询(嵌套 ...

  3. [SQL SERVER系列]之嵌套子查询和相关子查询

    子查询有两种类型,一种是只返回一个单值的子查询,这时它可以用在一个单值可以使用的地方,这时子查询可以看作是一个拥有返回值的函数:另外一种是返回一列值的子查询,这时子查询可以看作是一个在内存中临时存在的 ...

  4. 百度地图JavaScript API经纬度查询-MAP

    百度地图JavaScript API经纬度查询-MAP-ABCDEFGHIJKMHNOPQRSTUVWXYZ: 搜索:<input type="text" size=&quo ...

  5. 相关子查询和嵌套子查询 [SQL Server]

    SQLServer子查询可以分为 相关子查询 和 嵌套子查询 两类.前提,假设Books表如下: 类编号  图书名         出版社               价格-------------- ...

  6. ​《数据库系统概念》4-DDL、集合运算、嵌套子查询

    一.DDLa) SQL Data DefinitionSQL的基本数据类型有char(n).varchar(n).int.smallint.numeric(p,d).real,double preci ...

  7. SuperMap iClient for JavaScript 之关联查询

    人们常说,计划赶不上变化.同样的,在项目中,使用的数据也是在不断变化的,尤其是属性信息的改变.就比如说,地图上的地物,它的空间信息在比较长的时间内,都不会发生变化,他的属性信息在初期不完整或者与后来的 ...

  8. SQL嵌套子查询和相关子查询的执行过程有什么区别(推荐)

    SQLServer子查询可以分为 相关子查询 和 嵌套子查询 两类.前提, 假设Books表如下: 类编号 图书名 出版社 价格 ----------------------------------- ...

  9. HTML(DOM)与JavaScript嵌套数组之间相互转换

    html2ja:将html目标元素解析为JavaScript数组字面量,每项的值为tagName, className, id等CSS选择器组合: showJa:将html2ja生成的数组缩进格式化显 ...

随机推荐

  1. C#的接口

    什么是接口?其实,接口简单理解就是一种约定,使得实现接口的类或结构在形式上保持一致.个人觉得,使用接口可以使程序更加清晰和条理化,这就是接口的好处,但并不是所有的编程语言都支持接口,C#是支持接口的. ...

  2. Java中创建对象的5种方式

    作为Java开发者,我们每天创建很多对象,但我们通常使用依赖管理系统,比如Spring去创建对象.然而这里有很多创建对象的方法,我们会在这篇文章中学到. Java中有5种创建对象的方式,下面给出它们的 ...

  3. layer弹出框小结

    1.layer.open() // 1.打开弹出层 layer.open({ type:1, //基本层类型 icon:, //图标 content:'请核对信息!', //内容 shade:0.3, ...

  4. Selenium+python 配置

    1. 安装python, www.python.org. 下载最新的python,应该是32位的.注意配置环境变量. 2. 安装PIP(pip是一个以Python计算机程序语言写成的软件包管理系统). ...

  5. 安装cocoapods及相关问题解决

    申明:本博客大部分内容转载自简书http://www.jianshu.com/p/b64b4fd08d3c,但还有些问题博主在这里做了补充. Mac系统版本:10.12.1 一.什么是CocoaPod ...

  6. oracle临时表空间操作

    1.查看临时表空间 (dba_temp_files视图)(v_$tempfile视图)select tablespace_name,file_name,bytes/1024/1024 file_siz ...

  7. 【12-26】go.js

    var $ = go.GraphObject.make; // for conciseness in defining templates function buildAlarm(row,column ...

  8. vtkTubeFilter实例

    filter that generates tubes around lines vtkTubeFilter is a filter that generates a tube around each ...

  9. 第3月第21天 nsclassfromstring返回null SVN报错:clean the working copy and then retry the operation

    1. xcodeproj工程损坏时,.m文件没有加入编译. 2. SVN报错:clean the working copy and then retry the operation http://bl ...

  10. 【Android接百度地图API】百度地图Demo点击按钮闪退

    运行百度地图自带的BaiduMap_AndroidSDK_v4.1.0_Sample里面的BaiduMapsApiASDemo发现点击上面的按钮会闪退,控制台报的是xml的问题 查了一下,官方文档特别 ...