Java正则表达式匹配字符串中的所有单词
Posted
技术标签:
【中文标题】Java正则表达式匹配字符串中的所有单词【英文标题】:Java regex to match all words in a string 【发布时间】:2015-12-23 19:01:38 【问题描述】:我正在寻找一个匹配以下模式的正则表达式
(abc|def|ghi|abc+def+ghi|def+ghi)
基本上由|
分隔的所有内容都是 OR 搜索
并且所有与+
连接的词都必须存在。
我必须根据上述格式的输入字符串动态构造正则表达式。
我尝试了以下 AND 搜索:
(?=.*?\babc\b)(?=.*?\bdef\b)(?=(.*?\bghi\b)
跟随 OR 搜索
.*(abc|def).*
是否有可能的单个正则表达式?任何例子都会有所帮助
【问题讨论】:
提供一些有效/无效的输入字符串。 【参考方案1】:(abc|def|ghi)
这将匹配包含您要查找的单词的每个字符串。
【讨论】:
它不会将搜索限制为 abc+def+ghi,即所有三个单词都必须存在。 为什么要限制搜索?您不是也在搜索 abc、def 或 ghi 吗?任何单独找到这三个的东西也会找到 abc+def+ghi 和 def+ghi。【参考方案2】:
AND
搜索
您列出以下内容:
(?=.*?\babc\b)(?=.*?\bdef\b)(?=(.*?\bghi\b)
我的版本:
(?=.*?\babc\b)(?=.*?\bdef\b)(?=.*?\bghi\b).
请注意,您的版本会在 ghi
测试之前出现一个额外的 (
。
还请注意,我在末尾包含了一个.
(捕获任何单个字符),这样正则表达式实际上可以匹配某些内容,否则您只是在进行前瞻而不进行实际搜索。
OR
搜索
要搜索"abc" OR "def"
,我会使用以下正则表达式:
\babc\b|\bdef\b
或
\b(?:abc|def)\b
结合
因此,对于您的 (abc|def|ghi|abc+def+ghi|def+ghi)
示例,实际的正则表达式可能如下所示:
\babc\b|\bdef\b|\bghi\b|(?=.*?\babc\b)(?=.*?\bdef\b)(?=.*?\bghi\b).|(?=.*?\bdef\b)(?=.*?\bghi\b).
这是一个不好的例子,因为它自己会匹配 abc
,因为第一个 OR
案例而不是中间 AND
案例指定的要求。
记得指定正则表达式的大小写敏感度。
【讨论】:
【参考方案3】:编写了这个示例方法match(String input, String searchFilter)
public static void main(String[] args)
String input = " dsfsdf Invalid Locatio sdfsdff Invalid c Test1 xx Test2";
String searchFilter = "Invalid Pref Code|Invalid Location+Invalid company|Test|Test1+Test2";
System.out.println(match(input, searchFilter));
/**
* @param input
* @param searchFilter
*/
private static boolean match(String input, String searchFilter)
List<String> searchParts = Arrays.asList(searchFilter.split("\\|"));
ArrayList<String> ms = new ArrayList<String>();
ArrayList<String> ps = new ArrayList<String>();
for (String pls : searchParts)
if (pls.indexOf("+") > 0)
ms.add(pls);
else
ps.add(pls);
ArrayList<String> patterns = new ArrayList<>();
for (String msb : ms)
StringBuffer sb = new StringBuffer();
for (String msbp : msb.trim().split("\\+"))
sb.append("(?=.*?\\b").append(msbp.trim()).append("\\b).");
patterns.add(sb.toString());
Pattern p = Pattern
.compile("\\b(?:" + StringUtils.join(ps, "|") + ")\\b|"+ StringUtils.join(patterns, "|"),
Pattern.CASE_INSENSITIVE);
return p.matcher(input).find();
【讨论】:
【参考方案4】:assertTrue(Pattern.matches("\\((\\w+(\\||\\+))+\\w+\\)", "(abc|def|ghi|abc+def+ghi|def+ghi)"));
【讨论】:
所以如果我传入一个输入字符串“hey abc, hi def, yo ghi”,它将如何匹配?以上是关于Java正则表达式匹配字符串中的所有单词的主要内容,如果未能解决你的问题,请参考以下文章