匹配三个词搜索的正则表达式 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";
一起使用
我有两个用于搜索算法的交易品种字符串查询。我有一个由逗号分隔的三个单词组成的字符串。我要的是在这三个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";