正则表达式通配符匹配

新手上路,请多包涵

我有一个大约 12 万个英语单词的列表(基本上是该语言中的每个单词)。

我需要一个正则表达式,允许使用通配符搜索这些词,又名 *?

几个例子:

  • if the user searches for m?st* , it would match for example master or mister or mistery .
  • if the user searches for *ind (any word ending in ind ), it would match wind or bind or blindgrind

现在,大多数用户(尤其是那些不熟悉正则表达式的用户)都知道 ? 是对 1 个字符的替换,而 * 是对 0、1 或更多字符的替换人物。我绝对想基于此构建我的搜索功能。

我的问题是:如何将用户键入的内容(例如 m?st* )转换为正则表达式?

我搜索了网络(显然包括这个网站),我所能找到的都是试图教我太多的教程或有些相似的问题,但不足以为我自己的问题提供答案。

我能想到的是我必须用 ? . 。所以 m?st* 变成 m.st* 。但是,我不知道用什么替换 *

任何帮助将不胜感激。谢谢你。

PS:我对正则表达式完全陌生。我知道它们有多强大,但我也知道它们很难学。所以我只是从来没有花时间去做……

原文由 Radu Murzea 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 422
2 个回答

除非你想要一些有趣的行为,否则我建议你使用 \w 而不是 .

. 匹配空格和其他非单词符号,您可能不希望它这样做。

所以我会用 ? 并将 \w 替换为 * \w*

此外,如果您希望 * 匹配至少一个字符,请将其替换为 \w+ 。 This would mean that ben* would match bend and bending but not ben - it’s up to you, just depends what your requirements are.

原文由 gnomed 发布,翻译遵循 CC BY-SA 3.0 许可协议

看看这个库: https ://github.com/alenon/JWildcard

它用正则表达式引号包装所有非通配符特定部分,因此不需要特殊字符处理:此通配符:

 "mywil?card*"

将转换为此正则表达式字符串:

 "\Qmywil\E.\Qcard\E.*"

如果您希望将通配符转换为正则表达式字符串,请使用:

 JWildcard.wildcardToRegex("mywil?card*");

如果你想直接检查匹配,你可以使用这个:

 JWildcard.matches("mywild*", "mywildcard");

默认通配符规则是“?” -> “.”, “ ” -> “. “,但如果您愿意,您可以通过简单地定义新规则来更改默认行为。

 JWildcard.wildcardToRegex(wildcard, rules, strict);

您可以使用源代码或直接使用来自 Bintray JCenter 的 maven 或 gradle 下载它: https ://bintray.com/yevdo/jwildcard/jwildcard

摇篮方式:

 compile 'com.yevdo:jwildcard:1.4'

行家方式:

 <dependency>
  <groupId>com.yevdo</groupId>
  <artifactId>jwildcard</artifactId>
  <version>1.4</version>
</dependency>

原文由 lenon 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题