4

所以我有myString其中包含字符串

"border-bottom: solid 1px #ccc;width:8px;background:#bc0b43;float:left;height:12px"

我想使用正则表达式来检查它是否包含"width:8px" (\bwidth\s*:\s*(\d+)px)

如果为真,则将宽度值(如上例中的 8)添加到我的 myList。

试图:

if (myString.contains("\\bwidth\\s*:\\s*(\\d+)px")) {
    myList.add(valueofwidth) //unsure how to select the width value using regex
}

有什么帮助吗?

编辑:所以我研究了contains方法,发现它不允许正则表达式。matches将允许正则表达式,但它会寻找完整的匹配。

4

3 回答 3

5

您需要为此使用Matcher#find()方法。

从文档中: -

尝试查找与模式匹配的输入序列的下一个子序列。

然后您可以从中获取捕获的组:-

Matcher matcher = Pattern.compile("\\bwidth\\s*:\\s*(\\d+)px").matcher(myString);

if (matcher.find()) {
    myList.add(matcher.group(1));
}
于 2012-12-26T11:41:25.487 回答
4

您必须使用 Matcher 和 matcher.find():

Pattern pattern = Pattern.compile("(\\bwidth\\s*:\\s*(?<width>\\d+)px)");
Matcher matcher = pattern.matcher(args);
while (matcher.find()) {
    myList.add(matcher.group("width");
}
于 2012-12-26T11:42:12.077 回答
2

您的主要问题是contains()不接受正则表达式,它接受文字字符串。
matches()另一方面,确实接受正则表达式参数,但必须匹配整个字符串才能返回 true。

接下来,一旦你有你的比赛,你可以replaceAll()用来提取你的目标内容:

if (myString.matches(".*\\bwidth\\s*:\\s*\\d+px.*")) {
    myList.add(myString.replaceAll(".*\\bwidth\\s*:\\s*(\\d+)px.*", "$1"))
}

这会将整个输入字符串替换为您的原始正则表达式捕获的组 #1 的内容。

请注意,我从您的原始匹配正则表达式中删除了多余的括号,但将它们留给替换以捕获目标内容。

于 2012-12-26T11:39:31.267 回答