如何匹配以逗号或行尾结尾的子字符串?

时间:2014-08-06 10:05:56

标签: java regex

我想从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,而不是行尾。

如何匹配子字符串结束逗号和行结束?

7 个答案:

答案 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的正则表达式进行匹配:

(?<=,|^)([^=]+)=([^,]*)

RegEx Demo

<强>代码:

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;,没有任何边界匹配器含义。