JavaScript 正则表达式文字在函数调用之间保持不变

2024-04-08

我有这段代码:

function func1(text) {

    var pattern = /([\s\S]*?)(\<\?(?:attrib |if |else-if |else|end-if|search |for |end-for)[\s\S]*?\?\>)/g;

    var result;
    while (result = pattern.exec(text)) {
        if (some condition) {
            throw new Error('failed');
        }
        ...
    }
}

除非执行 throw 语句,否则这是有效的。在这种情况下,下次我调用该函数时, exec() 调用将从它停止的地方开始,即使我为其提供了新的“文本”值。

我可以通过写来修复它

var 模式 = new RegExp('.....');

相反,但我不明白为什么第一个版本失败了。正则表达式如何在函数调用之间保持不变? (这种情况发生在最新版本的 Firefox 和 Chrome 中。)

Edit完整的测试用例:

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<title>Test Page</title>
<style type='text/css'>
body {
    font-family: sans-serif;
}
#log p {
    margin:     0;
    padding:    0;
}
</style>
<script type='text/javascript'>
function func1(text, count) {

    var pattern = /(one|two|three|four|five|six|seven|eight)/g;

    log("func1");
    var result;
    while (result = pattern.exec(text)) {
        log("result[0] = " + result[0] + ", pattern.index = " + pattern.index);
        if (--count <= 0) {
            throw "Error";
        }
    }
}

function go() {
    try { func1("one two three four five six seven eight", 3); } catch (e) { }
    try { func1("one two three four five six seven eight", 2); } catch (e) { }
    try { func1("one two three four five six seven eight", 99); } catch (e) { }
    try { func1("one two three four five six seven eight", 2); } catch (e) { }
}

function log(msg) {
    var log = document.getElementById('log');
    var p = document.createElement('p');
    p.innerHTML = msg;
    log.appendChild(p);
}

</script>
</head>
<body><div>
<input type='button' id='btnGo' value='Go' onclick='go();'>
<hr>
<div id='log'></div>
</div></body>
</html>

在 FF 和 Chrome 上第二次调用时,正则表达式以“4”继续,在 IE7 或 Opera 上则不然。


通过正则表达式文字创建的 RegExp 对象会被缓存,但是new RegExp总是创建一个新对象。缓存的对象也保存它们的状态,但是管理这方面的规则显然不是很清楚。史蒂夫·莱维森 (Steve Levithan) 在这篇博文 http://blog.stevenlevithan.com/archives/fixing-javascript-regexp(靠近底部)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 正则表达式文字在函数调用之间保持不变 的相关文章

随机推荐

  • 对资源管理器中选定的文件执行 PowerShell 命令

    如何在 PowerShell 中仅对资源管理器中选定的文件执行重命名命令 我有 PS 命令 但我不知道将其放在 Windows 注册表中的何处 以便可以在资源管理器的右键单击上下文菜单中访问 HKCR shell 包含您需要的内容 使用您想
  • 将静态数据(不随时间变化)添加到 LSTM 中的序列数据

    我正在尝试建立一个如下图所示的模型 请看下图 我想在 LSTM 层中传递序列数据 在另一个前馈神经网络层中传递静态数据 血型 性别 后来我想将它们合并 然而 我对这里的维度感到困惑 如果我的理解是正确的 如图所示 5维序列数据如何与4维静态
  • 提取 Zip 内的目录

    我正在编写一个脚本 将 zip 存档中的文件提取到该脚本所在的目录中 这是我的代码 zip new ZipArchive if zip gt open latest zip TRUE zip gt extractTo zip gt clos
  • Web 服务器内置 Azure 应用服务

    背景 我正在托管一个静态 Web 应用程序 由 NUXTJS 在 Azure 应用服务上生成 现在我想通过以下方式配置更多内容web config比如为多个域设置 CORS 设置 但我找不到任何文档来确定 Azure 应用程序服务中集成 安
  • VB.NET 和 COM Interop 看似随机崩溃

    我正在考虑用 VB 6 重写一个全新的 VB NET 应用程序 该应用程序在终端服务下运行并大量使用 COM 由于某种原因 该应用程序存在随机奇怪之处 随机访问冲突错误 WinDbg 异常分析指向 dll 如 comdlg32 dll ms
  • Bigquery 如果字段存在

    简而言之 有没有办法在不存在的 BQ 字段中进行查询 并接收这些字段的 null 值 我有几乎同样的问题BigQuery IF 字段存在 THEN https stackoverflow com questions 32276601 big
  • PL/SQL 游标 for 循环

    我相信我需要一个循环游标来浏览表 test data 中的 street1 列 我有一个程序需要测试表中的每一行 这是我到目前为止所拥有的 cursor c1 is street1 from test data Begin If Instr
  • 如何调用Parent重写方法

    我有两个类 Parent 和 Child 从 Child 类 我调用父类重写方法 show 从父类 我调用另一个方法 display 但由于调用了 Child 方法 该方法也被重写 我想从show方法调用Parent方法display pu
  • jQuery - 翻转时更改另一个图像的 src

    我想知道是否有人可以帮助我 我有 2 张图像 如果有意义的话 我希望能够在翻转另一张图像时更改其中一张图像的 src 例如 我有 2 张图片 当有人将鼠标悬停在 imimage2 jpg 上时 我希望 imimage1 jpg 更改为 im
  • 我如何将长文本视图(字符串)显示到android的多个页面中

    我正在开发一个看起来像电子书阅读器 text pdf 文件等 的应用程序 我有一个巨大的文本 分为不同的章节或页面 现在的问题是如何将整个内容分成若干页并一页一页地显示 我怎么知道屏幕适合的字符数 取决于屏幕尺寸和字体大小 我完全不知道从哪
  • Javascript 加载、就绪、domready、DOMContentLoaded 事件

    我有点迷失在 启动 事件 有很多不同的事件 并且在 DOM 和各种框架 如 jQuery 中以不同的方式命名 所有可能的启动事件有哪些 它们有何不同 您能否显示一个简单的时间线来演示这些事件的触发顺序 ready JavaScript 提供
  • 逻辑运算的快捷方式

    我只是想知道 逻辑运算符 就像如果我想做类似的事情i i 10 我可以i 10 我搜索这个的原因是因为我有一个验证函数 它分为几个函数 以下是模拟 function f1 return Math ceil Math random 10 2
  • React JS 中适合父容器的多行文本

    我正在使用 Flexbox 布局 并尝试调整特定 div 中的文本大小以适合该 div 例如 如果我有如下代码 div div A really really really really long phrase here that will
  • 请注意,文档的某些部分可能包含文档检查器无法删除的个人信息

    I use Excel 2013 and Power View and SQL Server 2008 R2 创建我的后Data Source and my chart in Excel当我想要保存 Excel 文件时 我收到此消息 be
  • Elm - 检查值的类型

    是否存在检查 Elm 中变量类型的函数 例如 重复 numberTwo 2 returnType numberTwo number String 这样做的动机是当你使用Signal map n 通常会出现这样的情况 并非所有要应用的函数的参
  • 从外部访问 Leaflet.js GeoJson 功能

    我想从外部与传单驱动的地图的 GeoJson 覆盖层 多边形 进行交互L 的领域 但我似乎无法访问由L 互动包括 获取边界 我的特征 fitBounds 我的特征 设置样式 ETC 我可以看到 Leaflet 暴露了 L GeoJSON g
  • Nim 中的迭代器生成函数:在分配迭代器时起作用,在直接调用它时卡住

    我尝试创建一个创建迭代器的过程 如下所示 proc makeCDFrom start int iterator int result iterator int var i int start while i gt 0 echo i i yi
  • 将 Array 转换为原始方法来表达相同的结果,不使用 LINQ,仅使用 int。

    我的程序记录了四个房间在瓶子驱动器中收集的瓶子数量 当用户输入 quit 时 会显示每个房间收集的瓶子数量 并打印出拥有最多瓶子的房间 我使用了一个数组来跟踪房间号 如何更改方法而不是使用数组 我想启动 room1 room2 room3
  • Android Intent 启动应用程序的主要活动

    我正在尝试从 BroadcastReceiver 内部启动主要活动 我不想提供活动类名称 而是使用 android 的操作和类别来找出主要活动 这似乎不起作用 发送代码 Intent startIntent new Intent start
  • JavaScript 正则表达式文字在函数调用之间保持不变

    我有这段代码 function func1 text var pattern s S lt attrib if else if else end if search for end for s S gt g var result while