【问题标题】:tokenize string标记字符串
【发布时间】:2012-01-12 17:17:55
【问题描述】:

我得到了一个格式如下的字符串:yyyyMMdd_HHmm_ss_unitCode_(status)。 我需要将每个组件映射到专用类的属性。

我想用这样的正则表达式来定义我的令牌: {d+}4{d+}2{d+}2_{d+}2_{d+}2_{s+}3_{s+}2 => 为近似的正则表达式道歉,d 是十进制,s 是字符串。

我如何告诉我的解析器第一组 {d+}4 必须放在我班级的“年”属性中,第二组必须放在“月”属性中,依此类推。

显然,我可以这样做:token.setYear(substring(0,4)),但我想更通用一点,因为我无法控制文件名的结构。 我还考虑过定义一个 xml 结构,其中包含 startPosition、endPosition、要存储和键入的属性名称。

总而言之,我认为这一切都太复杂了。问题是我没有一个分隔符来使我能够使用String.split

【问题讨论】:

  • 你要解析一个字符串,你打算用正则表达式,但是你不知道字符串的结构?这真的很令人困惑。如果您不知道字符串的结构,我看不出您如何解析它。
  • 好问题。我没有得到的一件事是:“我无法控制文件名的结构”。所以字符串是文件名?
  • 我知道结构可以改变,这就是为什么我想通过正则表达式来定义它,以便能够随着结构的变化调整我的代码。
  • 是的,字符串是一个文件名:)

标签: java string mapping stringtokenizer


【解决方案1】:
String input; // yyyyMMdd_HHmm_ss_unitCode_(status)
SpecialClass output;

String regex = "(\\d{4})(\\d{2})(\\d{2})_(\\d{2})(\\d{2})_(\\d{2})_([^_]+)_\\((.+)\\)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);

if (m.matches())
{
    output.year = m.group(1);
    output.month = m.group(2);
    // etc
}

示例输入:

String input = "20120113_1234_27_500_(33)";

将产生以下组:

Group 1: 2012 //year
Group 2: 01   //month
Group 3: 13   //day
Group 4: 12   //hour
Group 5: 34   //minute
Group 6: 27   //second
Group 7: 500  //unitcode
Group 8: 33   //status

测试程序:http://pastebin.com/upC5R9rP

【讨论】:

  • 酌情调整正则表达式,具体取决于您要允许的可变性。
  • 我认为所有\d 都必须是\\d 以及\(,最后的([^)+) 应该做什么?
  • 你是正确的...... \\s 需要加倍。最后的事情是匹配字符直到但不包括结束的“)”。它缺少一个结束的“]”。
  • 我不得不再做一些修复——据我所知,正则表达式现在是正确的。这是一个测试程序:pastebin.com/upC5R9rP
猜你喜欢
  • 2012-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多