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

时间:2014-01-24 06:11:21

标签: python regex string escaping

我一直在寻找一种在Java源代码文件中查找带引号的文本字符串的简单方法。首先,我看了正则表达式。然后我意识到我有两个问题,因为正如this回答所述,对此没有完全正确的正则表达式,类似于标记语言出现的问题。主要问题来自于字符串中可能存在转义引号。

那么,我有什么选择来解析源代码文件以查找字符串(可能带有转义引用)?这样做有什么已经存在的吗?最好是在Python中。

编辑:这是一些过于简单的示例代码。

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

应该能够处理反斜杠的任何组合。期望的输出就是字符串本身。

4 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

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

答案 1 :(得分:1)

检测转义序列并引用组合\“并将其替换为其他组合。简单然后在引号内提取其他内容

答案 2 :(得分:1)

如何编写一个简单的状态机?一个简单的例子(只有双引号字符串)可以是:

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等状态。

答案 3 :(得分:0)

由于这很简单,你可能正在寻找比

更先进的东西
("(?:\\"|.)*")

Expl。:\\"会占用任何转义的引号,否则会匹配两个引号之间的任意数量的字符。

没有尝试过其他答案,所以这里可能已经有了正确答案,但无论如何......

此致

编辑:修复“缺陷”???简单地“吃掉”所有逃脱的反斜杠似乎都可以解决问题:

("(?:\\"|\\\\|.)*?")

再次编辑;):

我认为更好 - “吃掉”所有逃脱的角色:

("(?:\\.|.)*?")