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

//提取查询关键字,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. Sqlite使用

    安装命令行工具从http://www.sqlite.org/download.html下载Precompiled Binaries for Windows下的sqlite-tools-win32-x8 ...

  2. Install ArchLinux(draft)

    1.# dd bs=4M if=/path/to/archlinux.iso of=/dev/sdx status=progress && sync 2. # timedatectl ...

  3. webView和js交互

    与 js 交互 OC 调用 JS // 执行 js - (void)webViewDidFinishLoad:(UIWebView *)webView { NSString *title = [web ...

  4. sift特征源码

    先贴上我对Opencv3.1中sift源码的注释吧,虽然还有很多没看懂.先从detectAndCompute看起 void SIFT_Impl::detectAndCompute(InputArray ...

  5. python中使用heapq查看最大与最小的N个元素列表

    怎么从一个集合中获取最大或最小的N个元素列表? heapq模块有两个函数:nlargest() 和 nsmallest() 可以完美解决这个问题. In [39]: import heapq In [ ...

  6. JavaScript中的静态成员

    静态:共享 一.公有静态成员(作为函数的属性即可): var Gadget = function(price) { this.price = price; } Gadget.isShiny = fun ...

  7. 美国在研新药_读取单个PDF

    QQ:231469242 读取下载美国在研新药PDF内数据:unii,分子式,分子重量,药品名,who,编码,.... PDF无逻辑规则,不能百分之百提取,只能部分提取 几个默认字段为空 # -*- ...

  8. 我的Debian KDE常用软件记录

    1.看图 digiKam 2.音乐 Amarok

  9. spring data jpa 调用存储过程

    网上这方面的例子不是很多,研究了一下,列出几个调用的方法. 假如我们有一个mysql的存储过程 CREATE DEFINER=`root`@`localhost` PROCEDURE `plus1in ...

  10. 第五章 --- 关于Javascript 设计模式 之 发布-订阅模式

    先来个最简单的 发布订阅模式 document.body.addEventListener('click',function(){ alert(123); }); document.body.clic ...