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

匹配三个单词的正则表达式搜索java,java,regex,matcher,Java,Regex,Matcher,我有两个用于搜索算法的符号字符串查询。我有一个字符串,由三个用逗号分隔的单词组成。我想在这三个prarm中搜索 e、 g“字符串、文本、搜索” 如果输入为“Te”,则搜索应匹配,“Str”、“Se”也应匹配 我使用regex实现了。但它只适用于第一个单词。注意,我在第二个单词前有一个空格 stringInput="String, Text,Search"; word="St"; String pattern1=word+"\\w*,\\s\\w*,

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

e、 g“字符串、文本、搜索”

如果输入为“Te”,则搜索应匹配,“Str”、“Se”也应匹配

我使用regex实现了。但它只适用于第一个单词。注意,我在第二个单词前有一个空格

        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 第一个参数总是只有一个单词,第二个参数可以是两个或多个单词,第三个参数是两个-它可以是由空格分隔的多个单词。 文本,一些文本,其他文本它可以是任何文本,一些,其他文本
它也可以包含不同的符号,我要做的是搜索匹配每个参数中第一个单词的第一个字母。

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

您的第一个模式:
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
是要搜索的字符串

说明:

  • ^
    匹配字符串的开头,
    $
    匹配字符串的结尾
  • 有三个非捕获组
    (?:)
  • 每组由一个表示或的
    |
    分隔。因此,这些群体中只有一个需要匹配
  • 第一组是匹配第一个单词开头的搜索文本,简单来说就是搜索文本后跟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());
但是,有一个更简单的解决方案,不需要复杂的正则表达式模式

备选解决方案(拆分为单词,并检查是否有以搜索文本开头的选项):

替代解决方案(Java 8):


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

对于
模式3
,您忘记了在
模式1
中使用的相同点(或
\\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”一起使用

也许您可以在逗号前添加可选空格
\s*
,并使用单个
字符串模式1=“(“+word+”\\w*,\\s*\\w*,\\s*\\w |\\w*,\\s*”+word+“\\w*,\\s*\\w |\\w*,\\s*\\w*,\\s*“+word+\\w*”?见@WiktorStribiżew请参见问题中的澄清。这是一个很酷的主意,但我需要对第二个和第三个参数使用smth else,比如
String pattern1=“(“+word+”\\w*,\\s*\\w+(?:\\s+\\w+),\\s*\\w+(?:\\s+\\w+),\\s*\\w+(?:\\s+\\w+),\\s*\\w+(?:\\s+\\s+\\w+),\\s*\\w+,\\s*\\w+,\\s*\\s+\\s+\\w+)\\s+\\w+。(?:\\s+\\s+\\s+\\w+)\\s+\\w+)\\s*\\w+)\\w+?()@WiktorStribiżew我的意思是:word=KB,“KB…,KB…,KB…,KB…,KB…,在KB之后可以是任何东西。它可以包含像-之类的符号,除了逗号。这个模式怎么样:
(?=[\b\s]*)word
?if(stringInput.contains(text))不符合我的需要。你看,我想匹配第一个单词的开头。例如Word1,Word1….,Word1…..包含将给我例如“包含”“ai”,不在单词“包含”的开头“@JenyaKirmiza啊,我现在明白了。看看Wiktor Stribiżew的评论,他几乎明白我想要什么,他的方法很好,我明白了,很详细。另外,为什么使用\\w*而不是。*?您还可以使用逗号(String.split(,)分隔,删除空格/空白,并使用String.beginwith(word)检查它们。取决于你需要什么。格丽,我知道。我想用正则表达式来做。
boolean anyMatch = Arrays.stream(stringInput.split("\\s*,\\s*"))
                         .anyMatch(word -> word.startsWith(searchText));
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