我一直在寻找一种在Java源代码文件中查找带引号的文本字符串的简单方法。首先,我看了正则表达式。然后我意识到我有两个问题,因为正如this回答所述,对此没有完全正确的正则表达式,类似于标记语言出现的问题。主要问题来自于字符串中可能存在转义引号。
那么,我有什么选择来解析源代码文件以查找字符串(可能带有转义引用)?这样做有什么已经存在的吗?最好是在Python中。
编辑:这是一些过于简单的示例代码。
private static String[] b = {
foo("HG@\"rND"),
foo("K1\\"),
bar("ab\\\\\\\"")
}
应该能够处理反斜杠的任何组合。期望的输出就是字符串本身。
答案 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。:\\"
会占用任何转义的引号,否则会匹配两个引号之间的任意数量的字符。
没有尝试过其他答案,所以这里可能已经有了正确答案,但无论如何......
此致
编辑:修复“缺陷”???简单地“吃掉”所有逃脱的反斜杠似乎都可以解决问题:
("(?:\\"|\\\\|.)*?")
再次编辑;):
我认为更好 - “吃掉”所有逃脱的角色:
("(?:\\.|.)*?")