正则表达式"分号或字符串结尾"

时间:2017-02-18 20:45:50

标签: java html css regex jsoup

这是关于解析HTML的内联CSS样式属性。我使用JSoup但是我能够确定JSoup选择不帮助这个......我不确定为什么。这意味着用户必须找出关键字和值等合法字符的规则,即什么构成"正确形成" CSS样式"属性" (这是否是正确的术语?[ 稍后 :不!样式"属性",根据CSSParser]。

无论如何,在提取每个单独的键值对时,我想要做的是用分号分隔它们......但在最后一对中,尾随分号是可选的。但是,允许空格会以字符串的结尾结束。

所以我尝试了这个:

Pattern styleSubattrsPattern = Pattern.compile( "([A-Za-z0-9-]+)\\s*:\\s*([A-Za-z0-9-]+)\\s*[$;]");

...意思是"分号或字符串的结尾"。但它不起作用:最终的键值对不匹配。

使用CSSParser确实解决了根本问题。

2 个答案:

答案 0 :(得分:2)

使用[$;]将匹配分号或美元符号,因为[]中包含的特殊字符将引用字符文字(开头为^除外)匹配)。

您可能想要的是:((;)|($))

或者,您也可以使用问号来表示可选字符,如果您希望分号后面的行尾:;?$

答案 1 :(得分:1)

你可以使用否定的前瞻断言来做一个否定的字符类:Private Sub ButtonStrip1_Click(sender As Object, e As EventArgs) Handles ButtonStrip1.Click msgbox("You clicked " & sender.text & ".") End Sub

这处理两种情况:

  • 如果有角色,则此角色只能是(?![^;])
  • 否则,只允许字符串的结尾(没有字符)。

这样:

;

(我添加了占有量词来禁止回溯并避免无用的测试:Pattern styleSubattrsPattern = Pattern.compile( "([A-Za-z0-9-]+)\\s*:\\s*([A-Za-z0-9-]++)\\s*+(?![^;])"); => **+ => +