java - 循环遍历字符串并检查是否满足某些条件

标签 java string expression

我需要编写一段代码,它接受一个输入字符串参数,并确定每对加起来为 10 的数字之间是否正好存在 3 个问号。如果是,则返回 true,否则返回 false。一些示例测试用例如下

"arrb6???4xxbl5???eee5"      => true
"acc?7??sss?3rr1??????5"     => true
"5??aaaaaaaaaaaaaaaaaaa?5?5" => false
"9???1???9???1???9"          => true
"aa6?9"                      => false
我已经尝试在 Java 中实现它,如下所示,但结果并不如预期
public static String QuestionsMarks(String str) { 
str = str.replaceAll("[a-z]+","");
Pattern pattern = Pattern.compile("([0-9])([?])([?])([0-9])");
Pattern pattern01 = Pattern.compile("([0-9])([?])([?])([0-9])");
Matcher matcher01 = pattern01.matcher(str);
Pattern pattern02 = Pattern.compile("([0-9])([0-9])");
Matcher matcher02 = pattern02.matcher(str);
Matcher matcher = pattern.matcher(str);

if (matcher01.find() || matcher02.find()) {
return "false";
} else if (matcher.find()) {
  return "true";
 }

return "false";
}

最佳答案

检测用多个问号分隔的重叠数字的正则表达式如下:(?=((\d)([^?\d]*\?[^?\d]*)*(\d)))它使用正向前瞻 (?=)处理此模式的相邻匹配项之间的重叠数字:(\d)([^?\d]*\?[^?\d]*)*(\d) : 由任意数量的问号和其他可选字符分隔的两位数字。
Online demo of the regexp
因此,正则表达式提供了以下形式的匹配流:Group1=StringWithQuestionMarks, Group2=Digit, Group4=Digit这应该根据规则进行验证:将数字总和计算为 10,并将问号之间的问号计算为 3。
使用 Stream API 的示例实现:

private static final Pattern DIGS = Pattern.compile("(?=((\\d)([^?\\d]*\\?[^?\\d]*)*(\\d)))");

public static boolean hasTotal10Around3QMarks(String str) {
    
    Supplier<Stream<MatchResult>> ss = () -> DIGS
        .matcher(str)
        .results()
        .filter(r -> r.groupCount() == 4 
            && 10 == Integer.parseInt(r.group(2)) + Integer.parseInt(r.group(4))
        );
    
    return ss.get().findAny().isPresent() &&
           ss.get().allMatch(r -> 3 == r.group(1).chars()
                                                 .filter(c -> c == '?')
                                                 .count()
    );
}
Supplier<Stream>有助于重用 MatchResult 的流当没有匹配的数字对和 3 个问号( allMatch 用于空流返回 true )时,处理最后一个测试用例。
测试:
String[] tests = {
    "arrb6???4xxbl5???eee5",
    "acc?7??sss?3rr1??????5",
    "5??aaaaaaaaaaaaaaaaaaa?5?5",
    "9???1???9???1???9",
    "aa6?9",
    ""
};

Arrays.stream(tests)
      .forEach(t -> System.out.printf("'%s' => %s%n", t, hasTotal10Around3QMarks(t)));
输出:
'arrb6???4xxbl5???eee5' => true
'acc?7??sss?3rr1??????5' => true
'5??aaaaaaaaaaaaaaaaaaa?5?5' => false
'9???1???9???1???9' => true
'aa6?9' => false
'' => false

关于java - 循环遍历字符串并检查是否满足某些条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65814758/

相关文章:

java - 将c++中的unsigned char转换为java

java - JTable - 使表头不可见

arrays - Lua gmatch 将捕获的组存储为数组

c# - 如何有效比较两个 SHA512Managed 哈希值

java - 正则表达式 (regex) 不起作用

java - REST 服务发送损坏的文件

java - 使用 String.format

java - Java中的垃圾字符删除

c# - 用于比较 string[] 是否包含给定字符串的 lambda 表达式

c# - Entity Framework 结合来自不同实体的 lambda 表达式