小编Ted*_*Ted的帖子

java.util.regex.PatternSyntaxException:索引附近未关闭的字符类

我正在用 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)

java regex

4
推荐指数
1
解决办法
1万
查看次数

Protobuf getAllFields() 性能

我们使用 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 吗?

谢谢。

java performance protocol-buffers

4
推荐指数
1
解决办法
2567
查看次数

标签 统计

java ×2

performance ×1

protocol-buffers ×1

regex ×1