从字符串中提取自定义HTML属性

时间:2015-01-20 14:01:42

标签: java regex

我需要从字符串

中提取data-user_id个数字

输入字符串示例

 data-user_id="987654" lorem epsem  lorem epsem  lorem epsem  lorem
 data-user_id="123456-6" lorem epsem epsem  lorem epsem
 <img src="abcd.com"/> lorem epsem  data-user_id="123456"

预期输出

987654,123456-6,123456

我有的代码(不工作)

private static String getIdFromLine(String inputLine) {
    Pattern p = Pattern.compile("(data-user_id=\"[0-9a-z]*\")");
    Matcher m = p.matcher(inputLine);
    if (m.find()) {
        String src = m.group(2);
    }

    return null;
}

3 个答案:

答案 0 :(得分:4)

你应该有这个正则表达式:

data-user_id=\"([0-9a-z-]+)\"

group(1)将包含所需的输出。

您的代码遇到更多问题;你在结果上循环,而不是if你应该while循环:

while (m.find()) {
    //build the result here
{

答案 1 :(得分:1)

为了避免在每个方法调用上编译模式,我会写这样的方法:

private static Pattern DATA_USER_ID_PATTERN = //
        Pattern.compile("data-user_id=\"([0-9a-z-]+)\"");

private static String getIdFromLine(String inputLine) {
    String src = null;
    Matcher m = DATA_USER_ID_PATTERN.matcher(inputLine);
    if (m.find()) {
        src = m.group(1);
    }

    return src;
}

如果您确定没有多个线程会调用您的方法,您可以这样写:

private static Matcher DATA_USER_ID_MATCHER = //
        Pattern.compile("data-user_id=\"([0-9a-z-]+)\"").matcher("");

private static String getIdFromLine(String inputLine) {
    String src = null;
    Matcher m = DATA_USER_ID_MATCHER;

    m.reset(inputLine);
    if (m.find()) {
        src = m.group(1);
    }

    return src;
}

答案 2 :(得分:0)

您的尝试存在一些问题:

  1. 您的正则表达式与-字符不匹配(或大写字母,以防您需要)
  2. 您没有构建要返回的字符串
  3. 您没有使用while循环来获取单个字符串中的所有匹配项
  4. 编辑您现在已经编辑了问题以获得不同的输入字符串。目前尚不清楚你现在每行会有多个匹配。

    尝试:

    private static String getIdFromLine(String inputLine) {
        Pattern p = Pattern.compile("data-user_id=\"([0-9a-zA-Z-]*)\"");
        Matcher m = p.matcher(inputLine);
        StringBuilder sb = new StringBuilder("");
        while (m.find()) {
            String src = m.group(1);
            sb.append(src + ",");
        }
        int len = sb.length();
        if (len > 0)
            sb.delete(len - 1, len);
    
        return sb.toString();
    }