正则表达式提取一个命名的单词组直到换行?

时间:2013-09-17 02:15:23

标签: java regex

我试图弄清楚正则表达式将提取这些命名组,每个组都在一个单独的行上。试过不同的组合,但我被卡住了。例如,我无法提取localityDefault但得到:

  

hasData false

     

patternMatch7()null

public static void main(String[] args) throws Exception {
    String patternOfData = ".*?orgUnit1Default=(?<orgUnit1Default>\\S+)\\s+" +
            "orgUnit2Default=(?<orgUnit2Default>\\S+)\\s+" +
            "organizationDefault=(?<organizationDefault>\\S+)\\s+" +
            "localityDefault=(?<localityDefault>\\S+)\\s+?" +
            "stateDefault=(?<stateDefault>\\S+)\\s+?" +
            "countryDefault=(?<countryDefault>\\S+)\\s+";
    String receivedDataString = "orgUnit1Default=window washers \n"
            + "orgUnit2Default=All Cleaners \n"
            + "organizationDefault=Cleaning Dept \n"
            + "localityDefault=Small Town Here\n"
            + "stateDefault=Washington\n" 
            + "countryDefault=US";
    String toExtractName = "organizationDefault";

    System.out.println("patternMatch7()  "
            + patternMatch7(patternOfData, receivedDataString,
                    toExtractName));
}

static String patternMatch7(String patternOfData,
        String receivedDataString, String toExtractName) throws IOException {
    Pattern dataExtractionPattern;
    dataExtractionPattern = Pattern.compile(patternOfData, Pattern.DOTALL);
    Matcher matcher = dataExtractionPattern.matcher(receivedDataString);
    boolean hasData = false;
    String dataValue = null;
    if (matcher.find()) {
        hasData = true;
        dataValue = matcher.group(toExtractName);
    }
    System.out.println("hasData " + hasData);

    return dataValue;
}

2 个答案:

答案 0 :(得分:1)

我不确定您的数据看起来如何,但您可以尝试使用此正则表达式吗?

String patternOfData = ".*?orgUnit1Default=(?<orgUnit1Default>.+)\\s*\n" +
        "orgUnit2Default=(?<orgUnit2Default>.+)\\s*\n" +
        "organizationDefault=(?<organizationDefault>.+)\\s*\n" +
        "localityDefault=(?<localityDefault>.+)\\s*\n" +
        "stateDefault=(?<stateDefault>.+)\\s*\n" +
        "countryDefault=(?<countryDefault>.+)";

答案 1 :(得分:0)

你的模式假设换行前有空格,但是地址在换行前没有空格 - 使用*代替+

+ "organizationDefault=Cleaning Dept \n"
                                    ^     space character

+ "localityDefault=Small Town Here\n"
                                  ^       no space character...

为什么不使用LDAP搜索?