gpt4 book ai didi

java - 匹配三个词搜索java的正则表达式

转载 作者:行者123 更新时间:2023-11-30 06:52:46 25 4
gpt4 key购买 nike

我有两个符号字符串查询用于搜索算法。我有一个由逗号分隔的三个单词组成的字符串。我想要的是在这三个参数中搜索。

例如“字符串、文本、搜索”

如果输入是“Te”,搜索应该匹配,“Str”、“Se”也应该匹配。

我使用正则表达式实现。但它只适用于第一个词。请注意,我在第二个单词之前有一个空格。

        stringInput="String, Text,Search";
word="St";
String pattern1=word+"\\w*,\\s\\w*,\\w";

String pattern2="\\w*,\\."+word+"\\w*,\\w";

String pattern3="\\w*,\\w*,"+word+"\\w";

Pattern patternCompiled1=Pattern.compile(pattern1);
Pattern patternCompiled2=Pattern.compile(pattern2);
Pattern patternCompiled3=Pattern.compile(pattern3);
Matcher matcher1= patternCompiled1.matcher(inputString);

Matcher matcher2= patternCompiled2.matcher(inputString);

Matcher matcher3= patternCompiled3.matcher(inputString);

if(matcher1.find() || matcher2.find() || matcher3.find()){
return true;
}

你能帮我看看为什么它对第二个和第三个词不起作用吗?

一些说明

单词 1、字符串 1、字符串 2第一个参数始终只有一个单词,第二个参数可以是两个或多个单词,第三个参数两个 - 它可以是几个单词,用空格分隔。例如。文本、一些文本、其他文本文本它可以是任何文本、一些文本、其他文本它还可以包含不同的符号,我想要的是进行搜索以匹配每个参数中第一个单词的第一个字母。

最佳答案

您的模式不正确。我强烈建议您进一步了解正则表达式:

您的第一个模式:word+"\\w*,\\s\\w*,\\w" 匹配:

  • 要匹配的字符串
  • 后跟0个或多个单词字符
  • 后跟一个逗号
  • 后跟一个空白字符
  • 后跟0个或多个单词字符
  • 后跟一个逗号
  • 后跟单个单词字符

此模式适用于给定的输入字符串,但如果最后一个逗号后有空格,则会失败。

第二个模式:"\\w*,\\."+word+"\\w*,\\w" 匹配:

  • 0个或多个单词字符
  • 后跟一个逗号
  • 后跟文字。
  • 后跟要匹配的字符串
  • 后跟0个或多个单词字符
  • 后跟一个逗号
  • 后跟一个单词字符

这将不起作用,因为您已经转义了 . 字符 \\. 这意味着它将匹配文字 . 您的字符串所做的不包含。

你的最终模式:"\\w*,\\w*,"+word+"\\w" 匹配:

  • 0个或多个单词字符
  • 后跟一个逗号
  • 后跟0个或多个单词字符
  • 后跟一个逗号
  • 后跟要匹配的字符串
  • 后跟一个单词字符

这将失败,因为您没有考虑逗号后的空格。

一个正确的正则表达式模式应该是这样的:

^(?:%s.*,.*,.*)|(?:.*,\\s*%s.*,.*)|(?:.*,.*,\\s*%s.*)$

%s 是您要搜索的字符串。

解释:

  • ^ 匹配字符串的开头,$ 匹配它的结尾。
  • 有3个非捕获组(?:)
  • 每个组由 | 分隔,表示或。因此,这些组中只有一个需要匹配。
  • 第一组是在第一个单词的开头匹配搜索文本,简单地说,搜索文本后跟0个或多个任意字符,后跟逗号,后跟0个或多个任意字符...
  • 第二组是在第二个词的开头匹配搜索文本,这与第一个模式类似,除了我们只想匹配第二个词之前的空格而不是任何字符。
  • 第三组是在第三个单词的开头匹配搜索文本,这种模式与第二组几乎相同,只是移动了。

用法:

String pattern = String.format("^(?:%s.*,.*,.*)|(?:.*,\\s*%s.*,.*)|(?:.*,.*,\\s*%s.*)$", 
searchText, searchText, searchText);

Matcher m = Pattern.compile(pattern).matcher(stringInput);
System.out.println(m.find());

但是,有一个更简单的解决方案,不需要复杂的正则表达式模式。

替代解决方案(拆分成单词并检查是否有以搜索文本开头的):

private boolean anyWordStartsWith(final String words, final String search) {
for (final String word : words.split("\\s*,\\s*")) {
if(word.startsWith(search)) return true;
}
return false;
}

替代解决方案(Java 8):

boolean anyMatch = Arrays.stream(stringInput.split("\\s*,\\s*"))
.anyMatch(word -> word.startsWith(searchText));

关于java - 匹配三个词搜索java的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38436577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com