我正在寻找匹配以下模式的正则表达式
(abc|def|ghi|abc+def+ghi|def+ghi)
基本上由|
分隔的所有内容都是OR搜索
所有与+
相关的词语都必须存在。
我必须根据上述格式的输入字符串动态构造正则表达式。
我尝试关注AND搜索:
(?=.*?\babc\b)(?=.*?\bdef\b)(?=(.*?\bghi\b)
OR搜索以下
.*(abc|def).*
是否可以使用单个正则表达式?任何例子都会有所帮助
答案 0 :(得分:1)
(abc|def|ghi)
这将匹配包含您正在寻找的单词的每个字符串。
答案 1 :(得分:1)
AND
搜索您列出以下内容:
(?=.*?\babc\b)(?=.*?\bdef\b)(?=(.*?\bghi\b)
我的版本:
(?=.*?\babc\b)(?=.*?\bdef\b)(?=.*?\bghi\b).
请注意,在(
测试之前,您的版本会显示额外的ghi
。
另请注意,我在末尾包含.
(捕获任何单个字符),这样正则表达式实际上可以匹配某些内容,否则您只是在没有实际搜索的情况下进行前瞻。
OR
搜索要搜索"abc" OR "def"
,我会使用以下正则表达式:
\babc\b|\bdef\b
OR
\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
案例而不是uses
SysUtils, TypInfo;
type
ERuntimeTypeError = class(Exception);
TSet<T> = class
strict private
class function TypeInfo: PTypeInfo; inline; static;
public
class function IsSet: Boolean; static;
class function Cardinality(const Value: T): Integer; static;
end;
const
Masks: array[0..7] of Byte = (1, 2, 4, 8, 16, 32, 64, 128);
implementation
{ TSet<T> }
class function TSet<T>.TypeInfo: PTypeInfo;
begin
Result := System.TypeInfo(T);
end;
class function TSet<T>.IsSet: Boolean;
begin
Result := TypeInfo.Kind=tkSet;
end;
function GetCardinality(const PSet: PByteArray;
const SizeOfSet(*in bytes*): Integer): Integer; inline;
var
I, J: Integer;
begin
Result := 0;
for I := 0 to SizeOfSet - 1 do
for J := 0 to 7 do
if (PSet^[I] and Masks[J]) > 0 then
Inc(Result);
end;
class function TSet<T>.Cardinality(const Value: T): Integer;
var
EnumTypeData: PTypeData;
begin
if not IsSet then
raise ERuntimeTypeError.Create('Invalid type in TSet<T>, T must be a set');
Result := GetCardinality(PByteArray(@Value), SizeOf(Value));
end;
指定的要求在中间的情况。
请记住为正则表达式指定您的案例敏感度。
答案 2 :(得分:1)
写了这个示例方法 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();
}
答案 3 :(得分:0)
assertTrue(Pattern.matches("\\((\\w+(\\||\\+))+\\w+\\)", "(abc|def|ghi|abc+def+ghi|def+ghi)"));