当前位置: 首页 > 知识库问答 >
问题:

java中双面通配符的双向字符串匹配

姚向晨
2023-03-14

我有一个包含通配符的8个字符长的字符串列表(由表示),我需要将这些字符串与同样具有通配符的输入字符串匹配。所述字符串由四个字母字符(A-Z)和四个数字(0-9)组成。为了更容易理解,下面是一组字符串的示例:

ABCD1234
A??D123?
A???????
?BC1234?

如果我给一个?CD12?4作为输入,那么每次比较都应该解析为true。

Map<String, String> map = new HashMap<String, String>();

map.put("A???????", "A([A-Z]|\\?)([A-Z]|\\?)([A-Z]|\\?)([0-9]|\\?)([0-9]|\\?)([0-9]|\\?)([0-9]|\\?)");
map.put("ABCD1234", "ABCD1234");
map.put("A??D123?", "A([A-Z]|\\?)([A-Z]|\\?)D123([0-9]|\\?)");
map.put("?BCD123?", "([A-Z]|\\?)BC123([0-9]|\\?)");


String str = "A?CD12?4";
String strReg = "A([A-Z]|\\?)CD12([0-9]|\\?)4";

Set<Object> set = map.keySet()
               .stream()
               .filter(s -> str.matches(map.get(s)) || s.matches(strReg) )
               .collect(Collectors.toSet());

此处理发生在线程内部,外部交互可以更改输入将检查的字符串列表(仅添加或删除)。

共有1个答案

郎伟兆
2023-03-14

作为一般规则,在比较字符串时可以忽略通配符。因为这可以用于所有模式,所以不需要在映射中存储regex替换,所以在迭代时可以推断可以跳过字符。下面是一个使用并行流的更快解决方案:

Set<String> patterns = new HashSet<>();

patterns.add("A???????");
patterns.add("ABCD1234");
patterns.add("A??D123?");
patterns.add("?BCD123?");

String s = "A?CD12?4";

Set<String> matches = patterns.parallelStream() // the main benefit of this
                              .filter(p -> {
                                  for (int i = 0; i < s.length(); i++) {
                                      char a = s.charAt(i),
                                           b = p.charAt(i);
                                      if (a != '?' && b != '?' && a != b)
                                          return false;
                                  }
                                  return true;
                              }).collect(Collectors.toSet());
 类似资料:
  • 我想解析以下字符串: 我正在使用,所以我这里缺少的是正确的正则表达式。规则是正则表达式必须: 隔离任何单个单词 任何用双引号括起来的子字符串都是匹配的 单词中的双引号必须忽略(稍后我将用空格替换它们)。 因此,结果匹配应该是: < li>w1 w"2 < li>w3 < li>| < li>w4 < li>w"5 < li>w6 w7 双引号是否包含在双引号括起来的子字符串中是无关紧要的(例如,1

  • 问题 你想使用 Unix Shell 中常用的通配符(比如 *.py , Dat[0-9]*.csv 等)去匹配文本字符串 解决方案 fnmatch 模块提供了两个函数—— fnmatch() 和 fnmatchcase() ,可以用来实现这样的匹配。用法如下: >>> from fnmatch import fnmatch, fnmatchcase >>> fnmatch('foo.txt',

  • 比如说我有这个: 我想做两件事: 1) 使其成为当且仅当用户准确键入<代码>时!测试和其他内容,它将在通道中打印出测试 2)使其成为如果用户键入首先后跟空格和至少一个其他字符串字符,它将打印出——例如:a)不会打印出任何东西,b)(后跟一个空格)不会打印出任何东西,c)不会打印出任何东西,d)不会打印出任何东西,但是e)将打印出, f)将打印出, g)将打印出, and h)将打印出等。 我只知道

  • 我只是有一个关于在JAVA中添加一些货币($)的问题,我使用NumberFormat.getMONcyInstance();以“$”获取我的输出。我的程序是输入一些钱(字符串格式),例如程序只接受(100美元、50美元、20美元...等等),所以我使用了这段代码: 如何获取输入(100.00、50.00…)以从总价中减去它们。。例如我想要(100.00-12.00)(12.00是总价) 任何帮助都

  • 问题内容: 我正在编写一个简单的调试程序,该程序将简单的字符串作为输入,其中可以包含星号以指示通配符匹配-任何 我以为我会简单地采用该模式,转义其中的任何正则表达式特殊字符,然后将其替换为。然后使用正则表达式匹配器。 但是我找不到任何Java函数来转义正则表达式。我能找到的最佳匹配,然而这正好将与在开始和字符串的结尾。 Java中有什么可以让您简单地进行通配符匹配而不必从头开始实现算法的? 问题答

  • 问题内容: 如何在浏览器中显示的JavaScript字符串中包含双引号? 我正在做JavaScript作业,我必须在列表中间加上双引号,如下所示: 问题答案: 使用单引号。 或转义双引号。