首先,我们必须定义名称匹配的正则表达式,另外一个,
private static final String NAME_RE = "[A-Za-z0-9_]+";
private static final String VALUE_RE = "[A-Za-z0-9_\\[\\]\\.]+";
private static final String COMPARATOR_RE
= "<=|>=|=|is|<|>|startswith|Starts with|Beginswith|Begins with|Ends with|Endswith|Contains";
现在,我们可以创建模式,结合这些子正则表达式:
比较,而第三个是相匹配的值相匹配
private static final String RE = "\\s*\\[(" + NAME_RE + ")\\]\\s*"
+ "(" + COMPARATOR_RE + ")\\s*\\[\\s*("
+ VALUE_RE + "(?:\\s*,\\s*" + VALUE_RE + ")*)\\s*\\]"
+ "(?:\\s*,\\s*(.*))?";
private static final Pattern PATTERN
= Pattern.compile(RE, Pattern.CASE_INSENSITIVE);
请注意,它匹配的可能是也可能不是后跟逗号和其他规则的单个规则。
源字符串的解析必须重复的规则:
private static void parse(String source) {
String s = source;
while (s != null) {
Matcher matcher = PATTERN.matcher(s);
if (!matcher.matches()) {
throw new IllegalArgumentException("Invalid syntax: " + source);
}
String name = matcher.group(1);
String comparator = matcher.group(2);
String values = matcher.group(3);
s = matcher.group(4);
System.out.println("[" + name + "] " + comparator + " [" + values + "]");
}
}
现在,让我们尝试分析你的两个例子:
private static final String EXAMPLE1 = "[company] contains [abc,efg],[email] contains [cdf,test]";
private static final String EXAMPLE2 = "[company] contains [ab[]c,efg],[email] contains [siva,test]";
public static void main(String[] args) {
parse(EXAMPLE1);
parse(EXAMPLE2);
}
它产生以下输出:
[company] contains [abc,efg]
[email] contains [cdf,test]
[company] contains [ab[]c,efg]
[email] contains [siva,test]
更新:
请注意,必须限制值的内容,因为如果“efg”和“[email]包含[cdf”都是可接受的值,那么无法知道这些示例是由一个还是两个规则组成的。
更新2:
这里是VALUE_RE一个相当宽松的正则表达式:
private static final String VALUE_RE
= "[^,\\[\\]]*(?:\\[[^,\\[\\]]*\\][^,\\[\\]]*)*";
这里的值不能包含任何逗号,只有平衡支架,不包括嵌套。
你使用什么语言/工具?我不确定你可以使用纯正则表达式得到你想要的编号。 –
语言是JAVA – Naksh17