我想从LDAP专有名称中解析出所有属性。该属性以comman或行begin开头,以逗号或行结束。
我写了以下内容:
String patternStr = "[^,][A-Z]+=([A-Za-z0-9]+)[,$]";
String str = "CN=USERID003,OU=Users,DC=intern,DC=mycompany,DC=pl";
Pattern pattern = Pattern.compile(patternStr);
Matcher m = pattern.matcher(str);
while (m.find()) {
String substr = str.substring(m.start(), m.end());
System.out.println(substr);
System.out.println(m.group(1));
}
输出结果为:
CN=USERID003,
USERID003
OU=Users,
Users
DC=intern,
intern
DC=mycompany,
mycompany
正确匹配起始[^,]
函数,但块[,$]
仅匹配commans,而不是行尾。
如何匹配子字符串结束逗号和行结束?
答案 0 :(得分:3)
这应该根据您的说明
执行您想要的操作String patternStr = "(?:^|,)[A-Z]+=([A-Za-z0-9]+)(?:,|$)";
匹配从行/字符串或逗号的开头开始,以逗号或行/字符串结尾结束。
答案 1 :(得分:2)
我建议你忘记模式和匹配器,然后使用String.split()
- 它提供了你想要的所有功能,代码更具可读性。
String str = "CN=USERID003,OU=Users,DC=intern,DC=mycompany,DC=pl";
String[] attrs = str.split(",")
for (String attr : attrs) {
System.out.println(attr);
System.out.println(attr.split("=")[1])
}
希望这有帮助!
答案 2 :(得分:1)
为什么不使用str.split()?然后使用" for"搜索所有" XX = YYYY",如果您只需要属性名称或其值,则再次拆分。
答案 3 :(得分:1)
请试试这个:
[^,][A-Z]+=([A-Za-z0-9]+)(?:,|(?=$))
答案 4 :(得分:1)
您可以使用此基于lookbehind的正则表达式进行匹配:
(?<=,|^)([^=]+)=([^,]*)
<强>代码:强>
String patternStr = "(?<=,|^)([^=]+)=([^,]*)";
String str = "CN=USERID003,OU=Users,DC=intern,DC=mycompany,DC=pl";
Pattern pattern = Pattern.compile(patternStr);
Matcher m = pattern.matcher(str);
while (m.find()) {
System.out.printf("%s : %s%n", m.group(1), m.group(2));
}
<强>输出:强>
CN : USERID003
OU : Users
DC : intern
DC : mycompany
DC : pl
答案 5 :(得分:0)
正则表达式:(.+?,)|(.+)
请在此处查看:http://www.regexr.com/399a7
答案 6 :(得分:0)
您可以更改格式"[^,][A-Z]+=([A-Za-z0-9]+)[,$]"
到"(?:^|,)[A-Z]+=([A-Za-z0-9]+)(?:,|$)"
然后,您将获得所需的结果。
我猜你以前的问题是:
在[...]字符分组中,只包括字符,而不是&#39;边界匹配器&#39;
同时,[^,]表示除了&#39;之外的任何字符。而[,$]表示字符&#39;,&#39;或者字符&#39; $&#39;,没有任何边界匹配器含义。