我试图验证一个字符串,它必须以正确的顺序具有某种模式,并进一步将它们分成组。
我的预期格式为\60#######
或\60000000
其中
可能的匹配就像
所以我在下面编译正则表达式试图验证,并进一步将其分成组(期望2组(没有#)或3组(带#)):
Pattern numPattern = Pattern.compile("(\\\\{1})|([0-9]+)|(#*)");
我试图检测1 x \,1或更多0到9,任意数量的#。
单元测试:
private static void digest(String formatTxt) {
System.out.println("Doing: " + formatTxt);
Pattern numPattern = Pattern.compile("(\\\\{1})|([0-9]+)|(#*)");
if (numPattern.matcher(formatTxt).find()) {
System.out.println("Pattern matched!");
}
int i = 0;
Matcher matcher = numPattern.matcher(formatTxt);
while (matcher.find()) {
i++;
String data = matcher.group();
System.out.println(i + ". " + data);
}
System.out.println("");
}
public static void main(String[] args) {
digest("\\60000000000");
digest("\\6000000000000");
digest("\\60#########");
digest("\\60############");
digest("\\60############6");
digest("\\60########A####");
digest("\\lala60000000000");
digest("\\60#####6######");
digest("\\60#####6##A####");
}
结果:
// Doing: \60000000000
// Pattern matched!
// 1. \
// 2. 60000000000
// 3.
// Comment: OK but not sure why is there third element
//
// Doing: \6000000000000
// Pattern matched!
// 1. \
// 2. 6000000000000
// 3.
// Comment: OK but not sure why is there third element
//
// Doing: \60#########
// Pattern matched!
// 1. \
// 2. 60
// 3. #########
// 4.
// Comment: OK but not sure why is there forth element
//
// Doing: \60############
// Pattern matched!
// 1. \
// 2. 60
// 3. ############
// 4.
// Comment: OK but not sure why is there forth element
//
// Doing: \60############6
// Pattern matched!
// 1. \
// 2. 60
// 3. ############
// 4. 6
// 5.
// Comment: Not OK because I do not want anything behind #
//
// Doing: \60########A####
// Pattern matched!
// 1. \
// 2. 60
// 3. ########
// 4.
// 5. ####
// 6.
// Comment: Not OK because I do not want anything behind first group of #
//
// Doing: \lala60000000000
// Pattern matched!
// 1. \
// 2.
// 3.
// 4.
// 5.
// 6. 60000000000
// 7.
// Comment: Not OK because \\ must be followed by digits
//
// Doing: \60#####6######
// Pattern matched!
// 1. \
// 2. 60
// 3. #####
// 4. 6
// 5. ######
// 6.
// Comment: Not OK because I do not want anything behind first group of #
//
// Doing: \60#####6##A####
// Pattern matched!
// 1. \
// 2. 60
// 3. #####
// 4. 6
// 5. ##
// 6.
// 7. ####
// 8.
// Comment: Not OK because I do not want anything behind first group of #
感谢是否有人可以指导我在正则表达式中需要更改哪些内容以便达到上述要求?
答案 0 :(得分:2)
您可以使用以下正则表达式:
^(\\)(\d+)(#*)$
请参阅regex demo
在Java中,您可以将String rx = "(\\\\)(\\d+)(#*)"
与Matcher.matches
一起使用。
<强>详情
^
- 字符串的开头(隐含在matches()
)(\\)
- 第1组:单个反斜杠(\d+)
- 第2组:一个或多个数字(#*)
- 第3组:0 + #
字符$
- 字符串结尾(隐含在matches()
中)。已修复Java demo code:
private static void digest(String formatTxt) {
System.out.println("Doing: " + formatTxt);
Pattern numPattern = Pattern.compile("(\\\\)(\\d+)(#*)");
Matcher m = numPattern.matcher(formatTxt);
if (m.matches()) {
System.out.println("Pattern matched!");
System.out.println("1. " + m.group(1));
System.out.println("2. " + m.group(2));
System.out.println("3. " + m.group(3));
System.out.println("");
}
}