Java - 在两个##符号之间获取值时的问题(matcher-pattern)

时间:2014-10-17 13:46:25

标签: java regex

我有一个带值的字段

String a="Items:#1000#,#2000#";

我开发了逻辑以成功获得值1000和2000。

Pattern p = Pattern.compile("\\#(.*?)\\#");
Matcher m = p.matcher(a);

while(m.find()){
    System.out.println(m.group(1));
}

工作正常!!!

但是我遇到了一些问题,只有一个#符号和双##符号之后不应该考虑这些值。 例如:

 String a="Items:#1 #1000#,#2000#";

不应考虑此值1! 但是我的代码在这种情况下返回1,这不好,它应该再次返回10002000

这有可能以某种方式忽略价值#?不幸的是,在双##标志之前我有一个#的多个值? 值始终使用##coma

分隔

4 个答案:

答案 0 :(得分:1)

以下模式仅匹配#所包围的字符串,后跟逗号或字符串的结尾:

Pattern p = Pattern.compile("#([^#]*)#(?=(,|$))");

如果您希望匹配换行字符,可以在最后一个括号中添加更多字符(?=之后)。

我没有在Java中测试它,仅在Notepad ++中测试它,但两者都使用相同的正则表达式算法。

答案 1 :(得分:1)

这可以通过多种方式解决,它实际上取决于数据格式的静态程度。根据您列出的示例,您可以将正则表达式更改为:

Pattern p = Pattern.compile("\\#(\\S*?)\\#");

基本上只指定分组不能有空格。

答案 2 :(得分:1)

解决方案:

这只会匹配您想要匹配的内容。使用正则表达式更简单总是更好!

#([^,\s]+)# - Explaination

证明:

    final Pattern p = Pattern.compile("#([^,\\s]+)#");
    final Matcher m = p.matcher("Items:#1 #1000#,#2000#");
    while (m.find())
    {
        System.out.println("m.group(1) = " + m.group(1));
    }

输出:

m.group(1) = 1000
m.group(1) = 2000

答案 3 :(得分:-2)

#([^#]*)#(?=(,|$))假设这些组以,或行尾结束。如果你有一个空格(或其他角色),它就不会得到那个元素。

如果您#之间总是有数字(没有空格),可以使用\\#(\\d*?)\\#来解决此问题#1 #1000#,#2000#,而不是#1#1000#,#2000#