匹配三个单词的正则表达式搜索java
我有两个用于搜索算法的符号字符串查询。我有一个字符串,由三个用逗号分隔的单词组成。我想在这三个prarm中搜索 e、 g“字符串、文本、搜索” 如果输入为“Te”,则搜索应匹配,“Str”、“Se”也应匹配 我使用regex实现了。但它只适用于第一个单词。注意,我在第二个单词前有一个空格匹配三个单词的正则表达式搜索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*,
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