在源代码中查找引用的文本字符串

2024-10-17 08:20:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在寻找一种在Java源代码文件中查找带引号的文本字符串的简单方法。首先,我研究正则表达式。然后我意识到我有两个问题,因为正如thisanswer所说的那样,没有一个完全正确的正则表达式,类似于标记语言出现的问题。主要的问题是字符串中可能有转义引号。你知道吗

那么,我有什么方法来解析源代码文件以在其中找到字符串(可能带有转义引号)?有什么东西已经存在了吗?最好是用Python。你知道吗

编辑:下面是一些过于简化的示例代码。你知道吗

private static String[] b = {
    foo("HG@\"rND"),
    foo("K1\\"),
    bar("ab\\\\\\\"")
}

任何反斜杠的组合都应该能够处理。所需的输出将是字符串本身。你知道吗


Tags: 文件方法字符串代码标记文本语言编辑
3条回答

检测转义序列和引号组合\“,并用其他组合替换它。它很简单,然后提取引号中的其他内容

你可以这样使用:

import re

with open('input.java') as jfile:
    text = "".join(x.strip() for x in jfile)
m = re.findall(r'".*?(?<!\\)"', text)
for x in m:
    print x

但也有必要删除评论,这并不十分困难。或者看看Java parser。你知道吗

你知道吗 写一个简单的状态机怎么样?一个简单的例子(只有双引号字符串)可以是:

STATE_OUTSTRING = 0
STATE_INSTRING = 1
STATE_INSTRINGBACKSLASH = 2

def getstrings(text):
    state = 0
    strings = []
    curstring = None
    for c in text:
        if state == STATE_OUTSTRING:
            if c == '"':
                state = STATE_INSTRING
                curstring = ""
        elif state == STATE_INSTRING:
            if c == '\\':
                state = STATE_INSTRINGBACKSLASH
            elif c == '"':
                state = STATE_OUTSTRING
                strings.append(curstring)
                curstring = None
            else:
                curstring += c
        else: # STATE_INSTRINGBACKSLASH
            curstring += c
            state = STATE_INSTRING
    return strings

例如,如果需要,可以添加STATE_INCOMMENT这样的状态。你知道吗

相关问题 更多 >