2

関数に追加する/gと、lineRoute parseRoute1 回だけ返されるのはなぜですか?

pkt = "Record-Route: <sip:10.1.20.40;lr;r2=on>\r\nRecord-Route: <sip:10.1.20.40:80;transport=ws;r2=on;lr=on>\r\n"

parseRoute = (pkt) ->
        lineRoute = /Route\:/
        route = ""
        for line in pkt.split '\r\n'
            if lineRoute.test line
                tmp = line.split ': '
                route += tmp[1] + ", \r\n"
        return route
4

1 に答える 1

1

RegEx オブジェクトを再利用すると、すべての呼び出しがtest前の一致のインデックスから開始されます。したがって、test への各呼び出しの間に、このインデックスをリセットする必要があります。

lineRoute.lastIndex = 0

あなたの機能:

parseRoute = (pkt) ->
    lineRoute = /Route\:/
    route = ""
    for line in abc
        lineRoute.lastIndex = 0;
        if lineRoute.test line
            tmp = line.split ': '
            route += tmp[1] + ", \r\n"
    return route

このプロパティは、グローバル フラグが設定されている場合にのみ使用され/gます。これは、グローバル フラグを使用しない場合に機能する理由を説明しています。

詳細については、https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Regular_Expressions (検索lastIndex)をご覧ください。

于 2012-08-27T11:01:20.547 に答える