首先,我們必須定義名稱匹配的正則表達式,另外一個,
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