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

match regex for three words search java

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

例如"String, Text,Search"

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

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

        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;
            }

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

一些说明

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

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

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

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

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

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

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

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

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

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

这将失败,因为您没有考虑逗号后的白色 space。

一个正确的正则表达式模式类似于:

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

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

解释:

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

用法:

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));

对于 pattern2\. 将匹配点字符,但此时没有点(您可能只想使用点,而不使用 \,匹配任何字符)

对于 pattern3,您忘记了相同的点(或您在 pattern1 中使用的 \s)。

所以这应该是这样的:

String pattern1=word+"\w*,\s\w*,\w";
String pattern2="\w*,."+word+"\w*,\w"; // Or replace dot with \s
String pattern3="\w*,.\w*,"+word+"\w"; //Same here

如果您希望它与 stringInput="String, Text,Search";

一起使用