正则表达式正在捕获整个字符串

2023-12-19

我正在使用以下正则表达式:

(public|private +)?function +([a-zA-Z_$][0-9a-zA-Z_$]*) *\\(([0-9a-zA-Z_$, ]*)\\) *{(.*)}

匹配以下字符串:

public function messenger(text){
sendMsg(text);
}
private function sendMsg(text){
alert(text);
}

(字符串中没有换行符,它们在正则表达式运行之前被转换为空格)

我希望它捕获这两个函数,但它正在捕获: 1 美元:“” $2:“信使” $3:“文本” $4: " sendMsg(text); } 私有函数 sendMsg(text){alert(text); "

顺便说一句,我正在使用 JavaScript。


因为您在其他线程中接受了我的(错误)答案,所以我觉得自己有义务发布正确的解决方案。这不会很快也不会很短,但希望能有所帮助。

如果必须的话,下面是我如何为类 C 语言编写一个基于正则表达式的解析器。

<script>
/* 
Let's start with this simple utility function. It's a
kind of stubborn version of String.replace() - it
checks the string over and over again, until nothing
more can be replaced
*/

function replaceAll(str, regexp, repl) {
    str = str.toString();
    while(str.match(regexp))
        str = str.replace(regexp, repl);
    return str;
}

/*
Next, we need a function that removes specific
constructs from the text and replaces them with
special "markers", which are "invisible" for further
processing. The matches are collected in a buffer so
that they can be restored later.
*/

function isolate(type, str, regexp, buf) {
    return replaceAll(str, regexp, function($0) {
        buf.push($0);
        return "<<" + type + (buf.length - 1) + ">>";
    });
} 

/*
The following restores "isolated" strings from the
buffer:
*/

function restore(str, buf) {
    return replaceAll(str, /<<[a-z]+(\d+)>>/g, function($0, $1) {
        return buf[parseInt($1)];
    });
}

/*
Write down the grammar. Javascript regexps are
notoriously hard to read (there is no "comment"
option like in perl), therefore let's use more
readable format with spacing and substitution
variables. Note that "$string" and "$block" rules are
actually "isolate()" markers.
*/

var grammar = {
    $nothing: "",
    $space:  "\\s",
    $access: "public $space+ | private $space+ | $nothing",
    $ident:  "[a-z_]\\w*",
    $args:   "[^()]*",
    $string: "<<string [0-9]+>>",
    $block:  "<<block [0-9]+>>",
    $fun:    "($access) function $space* ($ident) $space* \\( ($args) \\) $space* ($block)"
}

/*
This compiles the grammar to pure regexps - one for
each grammar rule:
*/

function compile(grammar) {
    var re = {};
    for(var p in grammar)
        re[p] = new RegExp(
            replaceAll(grammar[p], /\$\w+/g, 
                    function($0) { return grammar[$0] }).
            replace(/\s+/g, ""), 
        "gi");
    return re;
}

/*
Let's put everything together
*/

function findFunctions(code, callback) {
    var buf = [];

    // isolate strings
    code = isolate("string", code, /"(\\.|[^\"])*"/g, buf);

    // isolate blocks in curly brackets {...}
    code = isolate("block",  code, /{[^{}]*}/g, buf);

    // compile our grammar
    var re = compile(grammar);

    // and perform an action for each function we can find
    code.replace(re.$fun, function() {
        var p = [];
        for(var i = 1; i < arguments.length; i++)
            p.push(restore(arguments[i], buf));
        return callback.apply(this, p)
    });
}
</script>

现在我们准备测试了。我们的解析器必须能够处理转义字符串和任意嵌套块。

<code>
public function blah(arg1, arg2) {
    if("some string" == "public function") {
        callAnother("{hello}")
        while(something) {
            alert("escaped \" string");
        }
    }
}

function yetAnother() { alert("blah") }
</code>

<script>
window.onload = function() {
    var code = document.getElementsByTagName("code")[0].innerHTML;
    findFunctions(code, function(access, name, args, body) {
        document.write(
            "<br>" + 
            "<br> access= " + access +
            "<br> name= "   + name +
            "<br> args= "   + args +
            "<br> body= "   + body
        )
    });
}
</script> 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正则表达式正在捕获整个字符串 的相关文章

随机推荐

  • 使用 markdown 创建 元素 (kramdown)

    是否可以使用 markdown 创建一个 span 元素 我正在使用 Kramdown 转换器 Thanks 根据Markdown 语法规范 文档 http daringfireball net projects markdown synt
  • 将 scala.math.BigDecimal 转换为 java.math.BigDecimal?

    我如何转换scala math BigDecimal to java math BigDecimal 无需与字符串进行双重转换 val sb scala math BigDecimal 12345 val jb sb bigDecimal
  • 在数据表的分页控件中显示不带省略号的页面

    我正在使用 jQuery Datatables JS 和 Bootstrap 我遇到了一个问题 有一个解决方法 但它不是最好的 问题 我的表包含超过 4k 条记录 如果处理表的人需要从记录 200 到 300 进行处理 并且为了方便起见 他
  • PHP - 从数据库构建多级关联数组(从数据库按州对城市进行排序)

    我对 php 有点陌生 在过去的几个小时里我一直在绞尽脑汁试图弄清楚这一点 我需要从数据库中按州对城市进行排序 我使用以下查询来检索数据集 SELECT state city FROM table ORDER BY state ASC ci
  • 如何克隆道具对象并使其不反应[重复]

    这个问题在这里已经有答案了 我有一些表单数据 我通过道具与子组件共享 现在我想克隆 prop 对象并使其不响应 就我而言 我希望用户能够修改 props 值 而无需实际更改克隆值 克隆值应该仅用于向用户显示编辑时的表单内容 下面的代码显示了
  • Swift:.classForCoder() 的替代方案

    给出以下代码 return TyphoonDefinition withClass AppDelegate classForCoder definition in definition injectProperty assembly 有必要
  • 内核sys_call_table地址与system.map中指定的地址不匹配

    我正在尝试温习 C 所以我一直在研究 Linux 内核的系统调用表 在 3 13 0 32 generic 上 我在网上找到了一个资源 它使用以下函数搜索系统调用表 并将其加载到 LKM 中的内核中 static uint64 t aqui
  • 如何在 Linq 中进行完全外连接?

    我继承了一个设计不完全优化的数据库 并且我需要操作一些数据 让我对我必须做的事情给出一个更常见的类比 假设我们有一个Student桌子 一个StudentClass记录他参加的所有课程的表格 以及StudentTeacher表存储了所有教过
  • 将 Spring Boot WAR 部署到 Tomcat 8 - 访问资源时出现 HTTP 404

    我是 Spring Boot 的新手 正在努力将一个简单的 HTML Web 应用程序 AngularJS 部署到 Tomcat 8 这个 Web 应用程序仅提供一些 HTML CSS JS 内容 没有对后端的 REST 调用 它是使用 W
  • 是否有 VS Code 和 VS Code 扩展的活动监视器?

    有一天 我在拔掉电源的情况下使用我的笔记本电脑 3 小时内它就从充满电到了 10 通常电池可以持续一整天 长话短说 VS Code 正在耗尽我的电池寿命 VS Code 的能源使用量似乎比排名第二的能源用户 Chrome 高出近 30 倍
  • 修改Devise重置密码错误文本

    使用 Devise GEM 当用户密码重置时 他们可以设置新密码 如果输入的密码不匹配或密码太短 您会收到默认消息 密码与确认不匹配 密码太短 最少8个字符 如何 在哪里可以更改这些错误消息的文本 将其添加到您的 config locals
  • iOS 7隐藏标签栏问题

    IOS7 中隐藏选项卡显示非正式行为 当我使用 self tabBarController tabBar hidden YES 上面的代码隐藏了 tabBar 但我的底部视图不保持交互式 但是当我在导航中推送 viewController
  • Mac Mini 足以用作 iPhone 开发机吗?

    所以过去我接触过的两个客户 所有的讨论都是关于创建一个 iPhone 应用程序 我不会撒谎 我想制作一个 或者至少学习如何制作它们 我从未拥有过 Mac 所以我不知道他们的操作系统如何工作 工作 执行 无论如何 我是一名 NET 开发人员
  • 如何读取 AngularJS 中 ArrayBuffer 中的二进制数据?

    在 AngularJS 中有 http get http docs angularjs org api ng 24http get动态获取数据 不幸的是 从官方文档中很难理解如何读取二进制数据 例如 用于图像操作 默认get获取数据作为St
  • 如何正确转义正则表达式中的字符

    我想在字符串内进行字符串搜索 简单地说MySTR search Needle 出现此问题时needle字符串包含特殊的正则表达式字符 如 等 它因错误而失败invalid quantifier 我浏览过网页 发现可以使用以下命令转义字符串
  • 响应式六边形网格

    我从互联网上加载了我的网站上的多个图像 是否有可能给所有这些图像一个六边形在响应式网格中 div img src link class Image div div img src link class Image div 我找到了多种方法来
  • 如何从 adb shell 检查 SharedPreferences?

    现在我们可以从远程 Shell 检查 sqlite3 数据库 http developer android com guide developing tools adb html sqlite 是否可以从 adb shell 检查 Shar
  • 通过ObjectID获取MongoDB集合

    MongoDB ID 对于单个数据库集群是唯一的 是否可以获取使用特定 ObjectID 的集合 我有一个 ObjectID 的十六进制表示形式 并且需要知道具有此 ID 的文档所在的集合 可能吗 它不是本机功能 但可以通过迭代所有集合来实
  • “返回等待承诺”和“返回承诺”之间的区别

    鉴于下面的代码示例 行为是否有任何差异 如果有 这些差异是什么 return await promise async function delay1Second return await delay 1000 return promise
  • 正则表达式正在捕获整个字符串

    我正在使用以下正则表达式 public private function a zA Z 0 9a zA Z 0 9a zA Z 匹配以下字符串 public function messenger text sendMsg text priv