我正在用 Java 编写正则表达式,但在运行程序时出现错误。
private final static Pattern QUOTE_VALUE = Pattern.compile("[_]?([a-zA-Z0-9_]+)=(\"[^]*\"),");
// Then later on down the road......
Macher m = QUOTE_VALUE.matcher(myString);
while (m.find()){
System.out.println("Found " + m.group(1) + " " + m.group(2));
}
Run Code Online (Sandbox Code Playgroud)
我想让我的正则表达式匹配这些示例值。
_MyKey="ID IN [ "ABC" ]", // Note - it has a comma after the ]
_MyKey="ID IN [ ""XYZ"" ]", // Note - it has a comma after the ]
Run Code Online (Sandbox Code Playgroud)
我使用在线正则表达式助手进行了尝试 - 我的正则表达式实际上工作正常。但是当我在 中运行程序时,出现此错误:
Caused by: java.util.regex.PatternSyntaxException: Unclosed character class near index 28
[_]?([a-zA-Z0-9_]+)=("[^]*"),
Run Code Online (Sandbox Code Playgroud)
另一个问题是,我如何格式化正则表达式,以便我也可以将它与此字符串匹配?
MyKey="ID …Run Code Online (Sandbox Code Playgroud) 我们使用 protobuf 作为消息传递,对于每条消息,我们都会循环遍历设置的字段,并用它做一些事情。
我们使用循环它
for ( final Map.Entry<Descriptors.FieldDescriptor, Object> entry : msg.getAllFields().entrySet()) {
FieldDescriptor field = entry.getKey();
Object value = entry.getValue();
Run Code Online (Sandbox Code Playgroud)
在profiler下,我们发现这个GetAllFields用的最多,我研究了一下,貌似没有其他办法了。
我知道我们可以使用这样做:
for ( final FieldDescriptor field : msg.getDescriptorForType().getFields()) {
if (!msg.hasField(field)){
continue;
}
Object value = message.getField(field);
Run Code Online (Sandbox Code Playgroud)
但 getDescriptorForType 返回所有字段而不仅仅是设置的字段。
有谁知道另一种更好的循环遍历字段的方法?我相信 getAllFields 的问题是每次创建一个新地图以及反射。我可以强制它在内部使用 Trove map 而不是常规的 hashmap 吗?
谢谢。