我需要从字符串
中提取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;
}
答案 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)
您的尝试存在一些问题:
-
字符不匹配(或大写字母,以防您需要)while
循环来获取单个字符串中的所有匹配项编辑您现在已经编辑了问题以获得不同的输入字符串。目前尚不清楚你现在每行会有多个匹配。
尝试:
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();
}