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

//提取查询关键字,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. js修改伪类的值

    css文件 p.change:after { content: attr(data-content); } js文件 $(this).addClass('change').attr('data-con ...

  2. Android View 的事件体系

    android 系统虽然提供了很多基本的控件,如Button.TextView等,但是很多时候系统提供的view不能满足我们的需求,此时就需要我们根据自己的需求进行自定义控件.这些控件都是继承自Vie ...

  3. Mac终端使用swift REPL异常处理方法

    Mac终端使用swift REPL异常处理方法 终端使用swift命令出现 warning: Swift error in module libmarisa.dylibDebug info from ...

  4. 在 .NET 中开发基于 Chrome 内核的浏览器-创建一个简单浏览器

    首先在 http://www.cftea.com/tools/downloads/Cef.zip 下载文件包. 一.将文件解压拖入到 Visual Studio 对应的 WinForm 项目中. 二. ...

  5. sublime text 3 3083 注册码

    亲试,可用! —– BEGIN LICENSE —– Andrew Weber Single User License EA7E-855605 813A03DD 5E4AD9E6 6C0EEB94 B ...

  6. 决策树及R语言实现

    决策树是什么 决策树是基于树结构来进行决策,这恰是人类在面临决策问题时一种很自然的处理机制.例如,我们要对"这是好瓜吗?"这样的问题进行决策时,通常会进行一系列的判断或" ...

  7. Linux 从零开始

    从Windows进入linux有太多不适应,对代码一无所知,接触Linux,从简单的开始垒砌. 加油最好的自己!

  8. c++语言友元函数和成员函数对运算符重载

    #include<iostream> using namespace std; /******************************************/ /*use mem ...

  9. logging 文件日志

    1. 例子 import logging logging.basicConfig(filename='log.txt', #文件名 level=logging.DEBUG, #级别 format=u' ...

  10. 07-本地 YUM 源制作

    1.YUM相关概念 1.1.什么是YUM YUM(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基 ...