【问题标题】:How to build a Java regular expression pattern using variables如何使用变量构建 Java 正则表达式模式
【发布时间】:2014-04-22 06:27:30
【问题描述】:

编辑以帮助澄清请求:

我需要构建一个由三个元素组成的 Java 正则表达式模式;一个正则表达式字符串与一个与正则表达式字符串末尾连接的整数变量连接。

示例 HTML:

<div class="page">1</div>
<div class="listItem"><a href="this-is/a-dummy-url-extension">

我开发的正则表达式模式:

int page = 1; 
Pattern p = Pattern.compile("page\">" + page + "</div><div class=\"listItem\"><a href=\"(.*?)\">");

目标:是使用正则表达式模式在使用以下方法逐行读取后定位上面的HTML行。

http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/essential/regex/examples/MatcherDemo.java http://docs.oracle.com/javase/tutorial/networking/urls/readingWriting.html

现在它不起作用。

【问题讨论】:

  • 您是否考虑过使用 DOM 解析器以可靠的方式完成此任务?见:blog.codinghorror.com/parsing-html-the-cthulhu-way
  • "我认为我的模式已经关闭,因为字符串文字版本正在下游输出。" > 你能举个例子来说明你的意思吗?您如何打印价值以及您看到了什么?
  • 很公平。也许提及文章的细节以获得进一步的信用:-)
  • 我仍然不清楚您遇到的确切问题。您可以创建一个小的minimal example 来演示您的问题并将其添加到您的问题中吗?我们可以复制/粘贴/运行并看到相同的挂起发生?
  • 澄清了上面的要求

标签: java regex


【解决方案1】:

你可以这样做:

String patternFormat = "slider\">%d</div><div class=\"listItem\"><a href=\"(.*?)\">";
pattern = Pattern.compile(String.format(patternFormat, 1));
pattern = Pattern.compile(String.format(patternFormat, 2));

【讨论】:

  • 如果 OP 的代码不起作用,为什么这个解决方案会起作用?您似乎唯一改变的是以更优雅的方式连接字符串。这是否解决了主要问题:“我认为我的模式已关闭,因为字符串文字版本正在下游输出”?
  • 感谢您的快速反馈。我把我的例子过度简化了,以便触及问题的核心。事实是我有数百页要通过,所以我希望每次循环获取所有数据属性并触发循环进入迭代 2、3、...465 等时增加一个变量。我想要增加变量+一个值以匹配循环增量。这有意义吗?
  • @PadawanDeveloper,现在有什么问题?
【解决方案2】:

解决了我的寂寞;我遇到的问题是;

  1. 我没有考虑结束标签和开始标签之间的空白。

  2. 第一个 div 标签位于与第二个不同的“行”上。如果您一次阅读一行并检查每一行中的模式,那么构建跨越两行的模式是行不通的。 :)

【讨论】:

  • 这是“两个问题”问题的经典例子。当@Duncan 建议使用不同的方法(DOM/SAX 解析器)时,他并不是一个聪明人。当页面的布局发生变化,或者另一个类被添加到 div 时会发生什么?您的正则表达式将开始失败。正则表达式设计用于正则语言,但 HTML(和其他类型的 SGML)根据定义始终是上下文无关语言。
  • 谢谢米克尔。我在编辑这篇文章时不小心删除了我对邓肯的回复。我回答说我不能使用 DOM 解析器,因为我们被要求使用 Regex 进行分配。否则我会使用 DOM。
  • 哦,好的。但是为了获得额外的荣誉,也许您可​​以指出使用正则表达式来解析非常规语言是一个坏主意。 :) twoproblems.com/1
  • @Mikkel - 谢谢,我计划毕业后回到 DOM 解析器方法。还有两个任务去争取!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多