我正在使用Regex
解析Java中的一些文本我的字符串看起来像这样:myAttribute =“some text”,我正在解析它们
Pattern attributePattern = Pattern.compile("[a-z0-9]*=\"[^\"]*\"");
但是,我意识到人们可能想在其属性值中使用双引号。
e.g。 myAttribute =“带有双引号的文字”“这里”
如何调整我的正则表达式以处理此
这是我解析属性的代码
private HashMap<String, String> findAttributes(String macroAttributes) {
Matcher matcher = attributePattern.matcher(macroAttributes);
HashMap<String, String> map = new HashMap<String, String>();
while (matcher.find()) {
String attribute = macroAttributes.substring(matcher.start(), matcher.end());
int equalsIndex = attribute.indexOf("=");
String attrName = attribute.substring(0, equalsIndex);
String attrValue = attribute.substring(equalsIndex+2, attribute.length()-1);
map.put(attrName, attrValue);
}
return map;
}
findAttributes("my=\"some text with a double quote \\\" here\"");
应返回大小为1的地图 值应该是一些带有双引号的文本\“这里
答案 0 :(得分:1)
您可以为该
使用替换和正向后看断言Pattern attributePattern = Pattern.compile("[a-z0-9]*=\"(?:[^\"]*|(?<=\\\\)\")*\"");
(?:[^\"]*|(?<=\\\\)\")*
是一项更改,与[^\"]*
或(?<=\\\\)\"
匹配
(?<=\\\\)\"
匹配一个“,但前提是它有一个强烈反对。
答案 1 :(得分:1)
您可以使用负面看后面来查看引号之前是否有反斜杠,但如果反斜杠本身也可以转义,则会失败:
myAttribute="some text with a trailing backslash \\"
如果可以的话,尝试这样的事情:
Pattern.compile("[a-zA-Z0-9]+=\"([^\"\\\\]|\\\\[\"\\\\])*\"")
快速解释:
[a-zA-Z0-9]+ # the key
= # a literal '='
\" # a literal '"'
( # start group
[^\"\\\\] # any char except '\' and '"'
| # OR
\\\\[\"\\\\] # either '\\' or '\"'
)* # end group and repeat zero or more times
\" # a literal '"'
快速演示:
public class Main {
private static HashMap<String, String> findAttributes(Pattern p, String macroAttributes) {
Matcher matcher = p.matcher(macroAttributes);
HashMap<String, String> map = new HashMap<String, String>();
while (matcher.find()) {
map.put(matcher.group(1), matcher.group(2));
}
return map;
}
public static void main(String[] args) {
final String text = "my=\"some text with a double quote \\\" here\"";
System.out.println(findAttributes(Pattern.compile("([a-z0-9]+)=\"((?:[^\"\\\\]|\\\\[\"\\\\])*)\""), text));
System.out.println(findAttributes(Pattern.compile("([a-z0-9]*)=\"((?:[^\"]*|(?<=\\\\)\")*)\""), text));
}
}
将打印:
{my=some text with a double quote \" here} {my=some text with a double quote \}