java - 解析具有可变键值对的字符串

标签 java string parsing

我有一个像这样的字符串:

*********** name: NOTINSTATE timestamp: 2015-09-16T12:33:01.253Z 
MyKeyValue1 = myData MyKeyValue2 = 0.0 based on filter: no Filter
********************************

在此字符串中,我有 KeyValuePairs:

"name" NOTINSTATE
"timestamp" 2015-09-16T12:33:01.253Z
"MyKeyValue1" myData
"MyKeyValue2" 0.0
"based on filter" no Filter

我正在以相反的方式思考像 Freemarker 这样的东西,但我不认为 Freemarker 具有其他功能。

我知道我可以用一种肮脏的方式来做到这一点,并使用模式并分割字符串,但必须有更好的方法来做到这一点。

有什么有用的建议或框架吗? 我的searchString本身将来不会改变。它将永远是一样的。

最佳答案

正则表达式是你的 friend :

String input = "*********** name: NOTINSTATE timestamp: 2015-09-16T12:33:01.253Z\n" +
               "MyKeyValue1 = myData MyKeyValue2 = 0.0 based on filter: no Filter\n" +
               "********************************";
String regex = "\\*+\\s+" +
               "(name):\\s+(.*?)\\s+" +
               "(timestamp):\\s+(.*?)\\s*[\r\n]+" +
               "(MyKeyValue1)\\s+=\\s+([^=]*)\\s+" +
               "(MyKeyValue2)\\s+=\\s+([^=]*)\\s+" +
               "(based on filter):\\s+(.*?)\\s*[\r\n]+" +
               "\\*+";
Matcher m = Pattern.compile(regex).matcher(input);
if (m.matches()) {
    Map<String, String> pairs = new LinkedHashMap<>();
    for (int i = 1; i <= 10; i += 2)
        pairs.put(m.group(i), m.group(i + 1));

    // print for testing
    for (Entry<String, String> entry : pairs.entrySet())
        System.out.printf("\"%s\" %s%n", entry.getKey(), entry.getValue());
}

输出正是您所显示的:

"name" NOTINSTATE
"timestamp" 2015-09-16T12:33:01.253Z
"MyKeyValue1" myData
"MyKeyValue2" 0.0
"based on filter" no Filter

更新

上面的正则表达式对空格比较宽松,但对键名称严格。您可以严格使用空格并宽松地使用键名,或任何其他组合:

String regex = "\\*+ " +
               "(\\w+): (.+?) " +
               "(\\w+): (.+?)[\r\n]+" +
               "(\\w+) = ([^=]+?) " +
               "(\\w+) = ([^=]+?) " +
               "([^:]+): (.+?)[\r\n]+" +
               "\\*+";

关于java - 解析具有可变键值对的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32635129/

相关文章:

java - Rest API 调用可在极短的时间内从多个 API 提供商获取数据 : Example websites like makemytrip

java - 使用 ViewPager2 折叠工具栏会出现滚动问题

java - 限制执行器中线程数量的速率 (Java)

c - 不使用 malloc 重复不同的字符串模式

parsing - 如何使用 perl6 语法创建解析树?

java - 在 Java 中解析格式错误的 json

java - 将微调器信息传递给另一个 Activity

python - Python 中的变量插值

c++ - 读取字符串时崩溃

c# - 如何解析像 "-2.000000e+000"这样的数字