簡體   English   中英

正則表達式:在字符串后的括號之間查找字符串

[英]Regex : Find string between brackets after a string

到目前為止,我的正則表達式是 ->

myRegex = /catch *\(.\) */

我希望能夠搜索以下字符串 -

try {
print(new Function (astatement)())
} catch (e)  { print(e.stack) }

因此 if.stack 在 catch(anything) 之后出現,它應該返回 true,到目前為止我已經設法到達 catch(anything),從這里卡住。

匹配 {[^}]+}

匹配異常處理程序中的簡單代碼,前提是沒有嵌套的花括號:

catch *\((\w+)\) *{[^}]+(\1)(\.stack)[^}]+}

上面的正則表達式匹配這些例子
(為了我的緣故捕獲組,如果不需要則刪除它們):

try {
  print(new Function (astatement)())
} catch (e)  { print(e.stack) }

try {
  print(new Function (bstatement)())
} catch (exception)  { print(exception.stack) }

你可以在這里試試:
https://regex101.com/r/PuytDJ/2

這里用到的一些技巧

\w+

而不僅僅是. 我假設你可以給異常實例任何名稱,所以在這里使用\w+可能更安全。

{[^}]+

這將查找左大括號並捕獲每個非右大括號直到下一個表達式。 它僅在您的異常處理程序中沒有嵌套花括號時才有效。

(\1)

在這里,我引用了在捕獲組 1 中找到的異常變量名稱。

(\.stack)

這是從字面上找到.stack

[^}]+}

我繼續解析所有非大括號字符,最后是右花括號。

免責聲明

⚠ 也就是說,正則表達式不能很好地解析嵌套元素,或者只能在一定程度上解析越來越復雜的表達式。
所以代碼塊、HTML/XML 標簽、JSON 對象等被更好地解析,而不是文本搜索。

使用 Javascript 解析器,您可以遍歷語法樹 (AST) 並在 catch 塊中找到每個“.stack”。

例如在 Python 中使用slimit

from slimit import ast
from slimit.parser import Parser
from slimit.visitors import nodevisitor


data = """
try {
    print(new Function(astatement)())
} catch (e) {
    print(e.stack)
}
"""

parser = Parser()
tree = parser.parse(data)

def nextCatch(tree):
    for node in nodevisitor.visit(tree):
        if isinstance(node, ast.Catch):
            return node


def nextIdentifierStack(tree):
    for node in nodevisitor.visit(tree):
        if isinstance(node, ast.Identifier) and node.value == 'stack':
            return node

def printChildren(node):
    for i, ch in enumerate(node.children()):
            print(f"{i:2}: {ch.to_ecma()}")


catch = nextCatch(tree)
printChildren(catch)
stack = nextIdentifierStack(catch)
print(stack.to_ecma())

打印:帶有 2 個孩子的 catch 塊和找到的stack標識符

 0: e
 1: {
  print(e.stack);
}
stack

另見Python 中的 JavaScript 解析器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM