【问题标题】:Regular expression to search for text using star characters使用星号字符搜索文本的正则表达式
【发布时间】:2023-03-28 16:40:02
【问题描述】:

我正在编写一个 Java 应用程序,用户可以在其中根据用户提供的过滤器减少字符串列表。

例如,用户可以输入一个过滤器,例如:

 ABC*xyz

这意味着用户正在寻找以 ABC 开头并且后面有 xyz 的字符串(这与搜索 ABC*xyz* 相同)

用户可以输入的另一个过滤器示例是:

 *DEF*mno*rst

这意味着字符串可以以任何开头,但必须跟在 DEF 之后,然后是 mno,然后是 rst。

我将如何编写 Java 代码以生成我需要确定我的字符串是否与用户指定的过滤器匹配的正则表达式?

【问题讨论】:

标签: java regex search filter


【解决方案1】:

如果将您的语法转换为正则表达式,这是执行此操作的“简单”方式(避免自己编写词法分析器),您必须记得适当地转义您的字符串。

因此,如果沿着这条路线走下去,您可能应该打算在语法中引用 不是 通配符的位,并加入正则表达式 .*(或 .+,如果你想要你的 @ 987654325@ 表示“至少一个字符”。这将避免在使用 *.() 和所有其他正则表达式特殊字符时出现错误的结果。

尝试类似:

public Pattern createPatternFromSearch(String query) {
    StringBuilder sb = new StringBuilder();
    for (String part : query.split("\\*")) {
        if (part.length() > 0) {
            sb.append(Pattern.quote(part));
        }
        sb.append(".*");
    }
    return Pattern.compile(sb.toString());
}

// ...

// then you can use it like....
Matcher matcher = createPatternFromQuery("*DEF*mno*rst").matcher(str);
if (matcher.matches()) {
   // process the matching result
}

请注意,通过使用Matcher#matches()(不是find)并保留结尾的.*,它将满足您仅在开头锚定的语法。

【讨论】:

  • 在这个解决方案中没有\*sequences(除了字面的,不会被误解——这不是Pattern.quote的工作方式。
【解决方案2】:

* 替换为.*,您就有了正则表达式。

String str = "*DEF*mno*rst";
String regex = str.replaceAll("*", ".*");

【讨论】:

  • 不,这在一般情况下不起作用:它没有锚定在 only 开头,并且它不处理任何特殊的正则表达式字符 (*, ?.|<()[]{}等)
  • 我同意@Nick B。我们可能想要转义特殊的正则表达式字符,这会使其有点复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多