1

是否有任何有效的 Java 解决方案/算法可以根据带有分隔符的键字符串在文本字段中查找值?

例子:

规则:

I. Key: 用户名 Start-Delimiter: ; 结束分隔符:;

需要找到一个值,如果其后跟键(在本例中为用户名)并且值在开始和结束分隔符之间(在本例中为 ;)。

二、键:on 开始分隔符:; 结束分隔符:;

样本输入:

用户名为 ;suren; 的用户 于 2013 年 5 月 2 日星期四下午 2:30 登录系统;

结果: I. 用户名 - Suren II。2013 年 5 月 2 日星期四下午 2:30

这是我迄今为止尝试过的一个示例:

String key = "username ";
String startDelimiter = ";";
String endDelimiter = ";";
String computedPattern = "(\\w+)" + key + startDelimiter + "(\\w+)" + endDelimiter;
Pattern p = Pattern.compile(computedPattern);
Matcher m = p.matcher(
  "A user with username ;suren; logged into the system on ;Thu May 2, 2013 2:30pm;");
while( m.find() ) {
  System.out.println( "Key:" + m.group(1) + "Value:" + m.group(2) );
}
4

1 回答 1

3

您的方法中的问题来自您对正则表达式的构造。如果您查看Pattern Class的 Java Docs ,您会发现\w它只匹配单词字符:[a-zA-Z_0-9]

听起来您只想在定义的键之后匹配分号之间的任何字符,中间的空格上有任何数字。正确的模式如下:

ArrayList<String> keys = new ArrayList<String>();
keys.add("username");
keys.add("on");
String startDelimiter = ";";
String endDelimiter = ";";
String searchStr = "A user with username ;suren; logged into the system on ;Thu May 2, 2013 2:30pm;";       
for (String key : keys) {
    Pattern p = Pattern.compile("("+key+")[ ]+?"+startDelimiter+"([^;]+)"+endDelimiter);
    Matcher m = p.matcher(searchStr);   
    while( m.find() ) {
        System.out.println("Key: "+m.group(1)+" Value: "+m.group(2));
    }
}

字符类[^;]+为您完成了这项工作,因为它匹配任何非空字符序列,其字符不同于";".

于 2013-05-21T13:44:13.053 回答