匹配两个左括号
match two open brackets
本文关键字:两个 更新时间:2023-09-26
假设我有这个
example: 1
[
this shouldn't be matched
]
example : 2
[
some bla
[
other bla
]
]
我观察以检查文件是否有任何嵌套括号. 我不想实际检查括号是否匹配 我只需要看看它们是否存在.
现在在我的脑海中这听起来很简单,但我无法从中得到任何东西(就正则表达式而言(
所以我想出了一些东西(希望是一个扫描仪(,这只是一个简单的Javascrpit函数。
function idNested(str){
// match all brackets
var g = str.match(/['[']]/g);
// join them into one string
var b = g.join('');
// match double bracket if there is any , it means that there is nesting :)
return b.match(/'['[/) ? true : false;
}
第一个正则表达式获取所有括号。 然后我将它们连接到一个大字符串中,并搜索两个相互跟随的括号.
所以我的问题实际上是基于两件事.
1 - 是否有一个正则表达式可以解决我的问题?!
2-此功能是否有任何缺点? 如果是这样,那么请提出其他建议。
回答数字 2:
不,如果您的括号嵌套正确,这不应该有任何缺点。
从本质上讲,您将字符串减少到仅其括号。在您的情况下,字符串将变为 [][[]]
。
假设我们一次处理字符串 2 个字符。只有 4 种可能的组合:
-
[[
我们找到了一个嵌套括号,并且我们完成了匹配,因为字符串的其余部分必须具有这些的右括号(例如[[]]
(。 -
[]
我们找到了一组括号,请忽略此结果,然后继续前进。 -
][
这永远不会发生,因为它意味着我们已经匹配了 1(例如[[][...
(,我们已经完成了算法,或者您有无效的括号嵌套(例如[]][
(。 -
]]
如果括号正确嵌套,我们将已经找到 1,因此永远不会达到此状态。
因此,您的算法将起作用。
答案 1:
话虽如此,使用单个正则表达式(假设正确嵌套(的代码会简单得多:
str.match(/'[[^']]*'[/)
将匹配的字符串:
-
[[]]
-
[[[]]]
-
[][[]]
不匹配的字符串:
-
[][]
-
[]
我们不关心的字符串(因为它们没有正确嵌套(:
-
[[
-
][[
-
[[[]]
为什么不检查一下:
'[ # Match an open bracket
[^']]*? # Match zero or more non-closing bracket ] lazily
'[ # Match another opening bracket
[^']]* # Match zero or more non-closing bracket ] greedily
'] # Match a closing bracket.
它的工作原理是这样的,如果我们匹配一个开放的布拉克[
,那么我们寻找另一个开括号[
,并确保我们不会越过右括号]
。
如果上述表达式匹配,则文本中存在嵌套。
var isNested = '[f daflkd [hfds ] fdaf d[ [] fd'.match(/'[[^']]*?'[[^']]*']/g);
注意:这假定文件不包含不当嵌套括号。
正则表达式 101 演示
相关文章:
- JQuery合并了keyup和focusout两个函数
- 如何使用 node.js 比较两个 json 数组
- 为复选框javascript指定两个值
- 用每小时的差值填充数组/列表-从下拉列表中给定两个时间值
- 单击时切换两个图像
- 我可以'我似乎不知道如何修复javascript中的两个lint.有人能帮我理解吗
- 基于两个条件退出While循环
- 如何在这里将两个值最低的数字相加
- 组合两个javascript函数
- 如何使用offer/answer交换来自两个对等连接的流
- jsf中两个字符串的颜色代码差异
- 加载两个具有相同父密钥名称的json文件
- 在Qualtrics中,介绍如何动态连接两个滑块
- 访问$.ajax()函数中的两个不同数组
- 如何在three.js上添加两个向量
- 如何在datetimepicker中使用两个验证器
- 如何在javascript中获取两个日期之间的周六和周日的日期
- 两个指令创建新的继承的和隔离的作用域-元素得到哪个
- javascript函数,它接受两个输入:一个对象和一个键,并返回对象中该键的相应值
- 这两个关于 JavaScript 作用域链的例子有什么区别?