【问题标题】:how can I exctract attribute value using JAVA regex如何使用 JAVA 正则表达式提取属性值
【发布时间】:2013-08-18 00:27:24
【问题描述】:

我有这样的字符串:

<a href="https://host-test.com/create?userName=test3&amp;user-mail=myemail@gmail.com&amp;id=14b72820-3855-4f2b-9a39-543ced6784a0&amp;downloadurl=https://host-test.com:443/123/rest/tmp-z7vvymo3wmfzke/vfs/v2/downloadzip/&amp;projectid=d29ya3NwYWNleXFpYXlwZjgwb2sxNDA2MjovY3JlYXRlQWNj:createAcc;" style="font-family:Myriad Pro,arial,tahoma,serif;color:#fff;font-size:14px;text-decoration:none;font-weight:bold" title="Confirm tenant creation" target="_blank">
                            <div style="font-family:'Lucida Grande',sans-serif;border-radius:5px;width:120px;min-height:40px;line-height:40px;border:1px solid #577e15;color:#fff;text-align:center;background:#e77431;margin:15px 0 15px">
                                Confirm
                            </div>
                        </a>

我需要使用正则表达式仅提取href值:

https://host-test.com/create?userName=test3&amp;user-mail=myemail@gmail.com&amp;id=14b72820-3855-4f2b-9a39-543ced6784a0&amp;downloadurl=https://host-test.com:443/123/rest/tmp-z7vvymo3wmfzke/vfs/v2/downloadzip/&amp;projectid=d29ya3NwYWNleXFpYXlwZjgwb2sxNDA2MjovY3JlYXRlQWNj:createAcc;

每次的href值也可以不同的更短或更长

【问题讨论】:

  • I need extract using regexp only 只是为了确保您不能使用任何解析器?
  • 我想我 read somewhere 你不能用 RegEx 解析 HTML,否则你会释放地狱之类的东西。
  • 不,我知道如何使用解析器来做到这一点..
  • @MikeChristensen 我更喜欢the less subjective article

标签: java regex parsing


【解决方案1】:
myString.replaceFirst(myString, "^<a\\s+href\\s*=\\s*\"([^\"]+)\".*", , "$1");

假设 myString 包含带有 a 元素的字符串。

由于 href 属性不能嵌套,这应该没问题,不需要完整的 HTML 解析器。一个限制是它只能在双引号中找到 href 属性。

【讨论】:

  • 您可以只使用正则表达式并捕获该模式。 &lt;a[^&gt;]*\shref=['"](.*)["']
  • 您的正则表达式会为 e 提供错误的结果。 G。 &lt;a href="a" id="y"/&gt;。然后它将捕获a" id="y
  • Aww 你的权利对不起我错过了它在字符串中有额外标签的地方,我的错。
【解决方案2】:

对于这个特定的字符串,您可以尝试类似

Pattern pattern = Pattern.compile("<a\\shref=\"([^\"]+)");
//or if you cant use group numbers use look-behind mechanism like
//Pattern.compile("(?<=<a\\shref=\")[^\"]+");
Matcher matcher = pattern.matcher(yourString);
if (matcher.find())
    System.out.println(matcher.group(1));

但如果您的字符串可以更改(例如 href atrubute 之前可以有其他属性),则它无法按预期工作。这是使用解析器而不是正则表达式的原因之一。

【讨论】:

    猜你喜欢
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 2011-10-08
    相关资源
    最近更新 更多