我有一个带值的字段
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
和,
这不好,它应该再次返回1000
和2000
这有可能以某种方式忽略价值#?不幸的是,在双##标志之前我有一个#的多个值?
值始终使用##
和coma
答案 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#